enum Alphabet {
A, B, C, D;
}
public class EnumTest {
public static void main(String[] args) {
String result = Arrays.stream(Alphabet.values())
.map(Enum::toString)
.collect(Collectors.joining(" - "));
System.out.println(result);
}
}
上記のコードの出力結果は?
- コンパイルエラー
- 実行時エラー
- Alphabet
- A - B - C - D
- ABCD
- 何も表示されない
解答
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
4: A - B - C - D
Alphabet.values()
は列挙した値をすべて配列で返す。
Arraysのstream(String[] array)
はStream<String>
型のStreamを返す。
mapでそれぞれの要素に対して、EnumのtoString()
をメソッド参照で呼び出し、適用する
(「e -> e.toString()
」でも可)。
toString()
は定数の名前をString型で返す。オーバーライド可能。
Enumのname()
も同じく定数の名前をString型で返すが、オーバライドできない(final)。
Collectors.joining(CharSequence delimiter)
で
入力要素を検出順に指定された区切り文字" - "で区切りながら連結するCollectorを返す。
その結果が変数resultに代入される。
補足:
Arrays.stream(String[] array) の使用例
String[] names = {"arres", "barres", "cess"};
List<String> namedList = Arrays.stream(names)
.map(n -> n + " - ")
.collect(Collectors.toList());
namedList.forEach(System.out::println);
出力
arres - barres - cess -
このように中間操作のmapを使うと、cess - のように最後の要素にまで" - "が連結される。
String型の配列に区切り文字を入れる場合、Stringクラスのjoinメソッドが利用できる。
String[] names = {"arres", "barres", "cess" };
System.out.println(String.join(" - ", names));
出力
arres - barres - cess