さて、今更ながらというか遅まきな感じですが、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でちょっと遊んでみました!