さて、今更ながらというか遅まきな感じですが、Java StreamAPIを使ってみようと思います。
前回のループあれこれから早半年(うそ)そろそろ私も大人になりました。
StreamAPIを使える力量を兼ね備えた!素敵なおじさんに!なったのではないかということで。。。
では、最初に1から10までの合計を。ちなみに和の公式では、10(10 + 1) / 2 という式になります。
10の部分を足し合わせたい数にすると1からの和が簡単に求まるよん!
まず、普通に書いてみます。sumとか使って。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package jp.pjin.tech.java; import java.util.Arrays; import java.util.List; public class StreamSample2_1 { private static int sum = 0 ; public static void main(String[] args) { List<Integer> ar = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); ar.forEach(i -> sum += i); System.out.println(sum); } } |
なんかいい感じに微妙なサンプルになりましたが、まあ、あまり気にしないことにして、次行ってみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package jp.pjin.tech.java; import java.util.Arrays; import java.util.List; import java.util.function.BinaryOperator; public class StreamSample2_2 { public static void main(String[] args) { List<Integer> ar = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); BinaryOperator<Integer> plus = new BinaryOperator<Integer>() { @Override public Integer apply(Integer t, Integer u) { return t + u; } }; int sum = ar.stream().map(val -> val).reduce(plus).orElse( 0 ); System.out.println(sum); } } |
Streamを利用して、BinaryOperatorを利用し匿名クラスで書いた例がこれです。
BinaryOperatorは2項演算用のクラスです。(なに2項演算って。。。。。1+1みたいなものです)
さて続いて、匿名クラスではなくラムダで書くとどうなるか見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package jp.pjin.tech.java; import java.util.Arrays; import java.util.List; import java.util.function.BinaryOperator; public class StreamSample2_3 { public static void main(String[] args) { List<Integer> ar = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); BinaryOperator<Integer> plus = (Integer t, Integer u) -> { return t + u; }; int sum = ar.stream().map(v -> v).reduce(plus).orElse( 0 ); System.out.println(sum); } } |
割合スッキリしてきましたね。もう少し省略してみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package jp.pjin.tech.java; import java.util.Arrays; import java.util.List; import java.util.function.BinaryOperator; public class StreamSample2_3 { public static void main(String[] args) { List<Integer> ar = Arrays.asList( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); BinaryOperator<Integer> plus = (t, u) -> t + u; int sum = ar.stream().map(v -> v).reduce(plus).orElse( 0 ); System.out.println(sum); } } |
BinaryOperatorの部分がわけがわからなくなってきました。returnを省略したりブロック({})を省略するとなんだかなーという感じになったりしますが。。。。
最初のサンプルと比べてなんだか釈然としませんが、Streamでちょっと遊んでみました!