今更ながらラムダで遊んでみる

超久しぶりの更新です。
久しぶり過ぎて何を書いていたかも忘れそうですが・・・。


Java8がいよいよリリースされました。
最近全然JavaについてWatchしていなかったので、
いろんな意味で隔壁の感があります。
Java8の機能を色々と触って行きたいと思います。


まずは、メインのラムダから。
といっても文法系は他のブログでいっぱい書かれているでしょうから、
ここではあまり触れませんw。


例えば、乱数を発生させてそれを出力させるサンプル。

List<Integer> list = new ArrayList<>();
Random rmd = new Random();
for (int i=0; i < 10_000_000;i++){
    list.add(rmd.nextInt(1_000_000));
}

list.forEach(in -> System.out.println(String.valueOf(in)));

in -> System.out〜の部分がラムダ表記を使っているところですね。


これだけだと寂しいので、sortしてみましょうか。
sortはColelctions.sortを使っても出来るのですが、
あえてStreamを使用してみます。

List<Integer> list = new ArrayList<>();
Random rmd = new Random();
for (int i=0; i < 10_000_000;i++){
    list.add(rmd.nextInt(1_000_000));
}
// Streamを使う
List<Integer> list2 = list.stream().sorted().collect(Collectors.toList());

list2.forEach(in -> System.out.println(String.valueOf(in)));


並列実行させたい場合にはstreamをparallelStreamにすれば並列実行します。

List<Integer> list = new ArrayList<>();
Random rmd = new Random();
for (int i=0; i < 10_000_000;i++){
    list.add(rmd.nextInt(1_000_000));
}
// Streamを使う
List<Integer> list2 = list.parallelStream().sorted().collect(Collectors.toList());

list2.forEach(in -> System.out.println(String.valueOf(in)));


因みにparallelStreamでSystem.out部分をコメントアウトした場合の実行時間は3回の平均で、7.672秒でした。
streamで実行した場合3回の平均が14.474秒だったので早くなっているのがわかります。
また、単純にCollections.sortを使用すると10.770秒だったので、
やはりstreamにする分オーバーヘッドがあるということでしょうか。


今回はsortという単純なもののでやっているので、
こうなっていますが、mapとかreduceとか使い出すとまた別の結果が出るでしょうね。
(というかstreamにすることのメリットはその辺が使えるからというのが大きいように思えます)


ということで、今回はこれまで。