大幅に強化されたコレクションAPI

コレクションAPIには、ラムダ式を活用するために大きな改善が加えられている。続いて、そちらの主な変更点をチェックしていこう。

既存のコレクションクラスに追加されたメソッド

まずは定番クラスである。たとえばjava.util.Listには以下のようなメソッドが追加されている。

  • forEach() … Listの各要素に対してラムダ式で繰り返し処理を行う
  • sort() … Listの要素をラムダ式で指定した条件でソートする
  • replaceAll() … Listの各要素をラムダ式で変換する
  • removeIf() … ラムダ式で指定した条件に一致する要素をListから削除する

これらのメソッドの使用例を以下に示す。

List<String> list = new ArrayList(Arrays.asList("Java", "Scala", "Groovy"));

// Listの要素に対してラムダ式で繰り返し処理を行う
list.forEach(s -> System.out.println("[" + s + "]"));
// ラムダ式で指定した条件でソート(文字数の多い順にソート)
list.sort((o1, o2) -> o2.length() - o1.length()); // => [Groovy, Scala, Java]
// Listの要素をラムダ式で変換する(大文字に変換)
list.replaceAll(s -> s.toUpperCase()); // => [GROOVY, SCALA, JAVA]
// 条件に一致する要素を削除する(Jで始まる要素を削除する)
list.removeIf(s -> s.startsWith("J")); // => [GROOVY, SCALA]

同様にMapには以下のようなメソッドが追加されている。主にキーの有無によって値の追加・上書きを行うかどうかを制御できるメソッドが追加されているのが特徴だ。

  • forEach() … Mapの各要素に対してラムダ式で繰り返し処理を行う
  • putIfAbsent() … 指定した値が存在しない場合だけMapに値を追加する
  • replace() … 指定したキーが存在する場合だけMapの値を上書きする
  • replaceAll() … Mapの各要素をラムダ式で変換する
  • compute() …ラムダ式の戻り値を指定したキーでMapに追加する
  • computeIfAbsent() … 指定したキーが存在しない場合だけラムダ式の戻り値をMapに追加する
  • computeIfPresent() … 指定したキーが存在する場合だけラムダ式の戻り値でMapの値を上書きする
  • getOrDefault() … 指定したキーの値を返す。キーが存在しない場合はデフォルト値を返す
  • merge() … 指定したキーが存在しない場合は値を追加、存在する場合は既存の値と指定した値をマージする

これらのメソッドの使用例を以下に示す。

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

// キーが存在しない場合のデフォルト値を指定して値を取得
int value = map.getOrDefault("D", -1);
// Mapの要素に対してラムダ式で繰り返し処理を行う
map.forEach((key, value) -> System.out.println(key + "=" + value));
// キーが存在しない場合のみMapに要素を追加
map.putIfAbsent("D", 4);
// キーが存在する場合のみMapの要素の値を上書き
map.replace("A", 5);
// Mapの要素をラムダ式で変換する
map.replaceAll((key, value) -> value * 2);
// キーが存在しない場合のみラムダ式の戻り値をMapに追加
map.computeIfAbsent("A", (key) -> LocalDate.now().getYear());
// キーが存在する場合のみラムダ式の戻り値でMapの要素の値を上書き
map.computeIfPresent("A", (key, value) -> value * 3);

また、java.util.ArraysにはJava 7から導入されたFork / Join Frameworkを使用した並列ソートを行うためのparallelSort()メソッドが追加されており、配列の高速なソートが可能になっている。

int[] array = ...
Arrays.parallelSort(array);