java

イマサラ 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でちょっと遊んでみました!

  • このエントリーをはてなブックマークに追加

PAGE TOP