Java8のStream API、使ってみたくてググったら色々出てきますが、
今回はfor文や拡張for文をStreamに書き換えるだけの方法を紹介します。
さらに、これだけでは特においしい部分が薄いので並列化する方法も紹介します。
for文
for(int i=0;i<100;i++){
System.out.println(i);
}
↓
IntStream intStream = IntStream.range(0, 100);
intStream.forEach(i -> {
System.out.println(i);
});
拡張for文 (for-each)
// List
List<String> list = Arrays.asList("a","b","c");
for(String s: list){
System.out.println(s);
}
// 配列
String[] array = {"a", "b", "c"};
for(String s: array){
System.out.println(s);
}
↓
// List
List<String> list = Arrays.asList("a","b","c");
Stream<String> listStream = list.stream();
listStream.forEach(s -> {
System.out.println(s);
});
// 配列
String[] array = {"a", "b", "c"};
// どちらも出来るものは同じ
Stream<String> arrayStream01 = Arrays.stream(array);
Stream<String> arrayStream02 = Stream.of(array);
arrayStream01.forEach(s -> {
System.out.println(s);
});
arrayStream02.forEach(s -> {
System.out.println(s);
});
並列化
- 作成したStreamで.parallel()を実行するだけ
- ただし、順番は保証されない(順番に実行するforEachOrdered()というメソッドも用意されているが並列化の意味が…)
- (追記)Stream元や処理によってはparallel()+forEachOrdered()の方が早いそうです
IntStream intStream = IntStream.range(0, 100).parallel();
Stream<String> listStream = list.stream().parallel();
おわりに
for文を単純にStream APIを使用して置き換える方法を紹介しました。
これらを使ってみつつ、やりたいことベースで中間処理とか末端処理のメソッドを調べていけばいいのではないでしょうか。
個人的には並列処理がメソッド一つで難しいことを考えずに気軽に使えるのがありがたいです。