2017.11.08
イマサラ Java StreamAPIを使ってみよう!
さて、今更ながらというか遅まきな感じですが、Java StreamAPIを使ってみようと思います。
前回のループあれこれから早半年(うそ)そろそろ私も大人になりました。
StreamAPIを使える力量を兼ね備えた!素敵なおじさんに!なったのではないかということで。。。
では、最初に1から10までの合計を。ちなみに和の公式では、10(10 + 1) / 2 という式になります。
10の部分を足し合わせたい数にすると1からの和が簡単に求まるよん!
まず、普通に書いてみます。sumとか使って。
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); } }
なんかいい感じに微妙なサンプルになりましたが、まあ、あまり気にしないことにして、次行ってみましょう!
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みたいなものです)
さて続いて、匿名クラスではなくラムダで書くとどうなるか見てみましょう。
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); } }
割合スッキリしてきましたね。もう少し省略してみましょう!
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でちょっと遊んでみました!