Java8のforEach文の使い方
Java8からラムダ式が書けるようになったので、拡張for文やIteratorを使う必要がなくなります。
Java8からjava.lang.IterableインタフェースにforEach文が追加されています。
default void forEach(Consumer<? super T> action)
Consumerインタフェースを引数に取ります。で、acceptメソッドのみです。
list.forEach(new Consumer<Employee>() { public void accept(Employee e) { System.out.println(e.getName() + " : " + e.getAge()); } });
これでacceptメソッドがlistの要素分実行されます。
ラムダ式を使うとこの書き方を省略することができます。
list.forEach(e -> System.out.println(e.getName() + " :" + e.getAge()));
eがlistの要素になり、標準出力します。さらにメソッド参照を使用して省略すると以下のように記述することができます。
list.forEach(System.out::println);
forEach文内でインクリメント演算子を使いたい場合があると思いますが、以下のような記述はできません。
int i = 0; list.forEach(e -> { i = i++; // エラー System.out.println(e.getName() + " :" + e.getAge()); });
forEach外にある変数をforEach内で参照する
forEachの外にある変数をforEach内で使用することはできません。
以下のように配列にしてあげると参照できるのですが良いコーディングではないと思います。
List<String> list = Arrays.asList("C", "C++", "Java", "Scala", "Ruby"); String[] arr = {"C"}; list.stream().forEach(s -> { if (s.equals(arr[0])) { System.out.println(s); } });
finalで定数にするとforEach内で参照することが可能になりますのでそちらの使い方の方が良いかもしれません。
List<String> list = Arrays.asList("C", "C++", "Java", "Scala", "Ruby"); final String str = "C"; list.stream().forEach(s -> { if (s.equals(str)) { // 正しく参照できる System.out.println(s); } });
forEachで引数を複数指定する
ListのListのstreamだとforEach((k,v) -> ~というように複数指定することができます。
List<Integer> list = Arrays.asList(1,2,3); Map<Integer, List<Integer>> ret = list.stream().collect(Collectors.groupingBy(n -> n%2)); ret.forEach((k, v) -> System.out.println(k + ":" + v);
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント