Java8のforEach文の使い方

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文内でインクリメント演算子を使いたい場合があると思いますが、以下のような記述はできません。

JavaのAtomicIntegerの使い方

int i = 0;
list.forEach(e -> {
  i = i++; // エラー
  System.out.println(e.getName() + " :" + e.getAge());
});

JSのforEach文の使い方

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);

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました