[前回:PermGenの廃止]
(http://qiita.com/yuusuke_s/items/16a63e6a311a3cde9fb6)
さて、StreamAPIとは何でしょう?どこかの説明を引用すると、
StreamAPIとは、コレクションなどの集合体に対し、集計や処理を行うことを目的としている。
そうです。
とりあえず、サンプルを作って動かしてみましょう。
StreamAPI
対象データの集計とソートを行う
/**
sで始まる名前を抽出し、降順にソートするサンプル
*/
public static void ramdaSampleFilterSort() {
final String[] data = {"shimizu", "tanaka", "sasaki", "suzaki"};
final List<String> list = Arrays.asList(data);
// 1.7までの書き方
List<String> ar1 = new ArrayList<>();
for(String a : list) {
if(a.startsWith("s")) {
ar1.add(a);
}
}
Collections.sort(ar1, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
System.out.println(ar1);
// 1.8での書き方
// Listからstreamを生成できる
List<String> ar2 = list.stream()
.filter(e -> e.startsWith("s"))
.sorted((e1, e2) -> e2.compareTo(e1))
.collect(Collectors.toList());
System.out.println(ar2);
}
結果
[suzaki, shimizu, sasaki]
[suzaki, shimizu, sasaki]
- Listインタフェースに追加されたstream()から、streamを取得できます
- filter()メソッドで、sで始まる名前のみを抽出しています。
- 引数は関数型インタフェースのため、ラムダ式を使います。
- sorted()メソッドでソートを行います。
- 引数は関数型インタフェースのため、ラムダ式を使います。
- 最後、collect()で、StreamからListに変換しています。
- コード例のように、メソッドチェーンで書けます。
最大値を取得する
public static void ramdaSampleFilterMax() {
final Integer[] data = {111, 10, 34, 99, 1092, 3};
// 配列からもstreamを生成できる
Integer max = Arrays.stream(data)
.max((e1, e2) -> e1.compareTo(e2))
.get();
System.out.println("max value is " + max);
final Integer[] data2 = {10000, 345};
// 二つのstreamを結合することもできる
max = Stream.concat(Arrays.stream(data), Arrays.stream(data2))
.max((e1, e2) -> e1.compareTo(e2))
.get();
System.out.println("max value is " + max);
}
結果
max value is 1092
max value is 10000
最後に
何となく雰囲気はつかめたのではないでしょうか?
シンプルなコードになることが分かりますね。
次回も引き続き、StreamAPIについて、別のサンプルを見てみたいと思います。