ストリームの概要
前書き
Stream
関数型プログラミングインターフェイスはJava8で最初に導入され、ラムダとともにJava開発のマイルストーン機能になりました。これにより、オープナーがコレクションデータを処理する効率が大幅に向上します。
Stream
これは、データが流れるパイプラインであり、データはパイプラインで操作されてから、次のパイプラインに流れます。
収集する
マージフロー
Person p1 = new Person("Tom", 11);
Person p2 = new Person("Jack", 12);
Person p3 = new Person("Jane", 15);
Person p4 = new Person("Mike", 14);
Person p5 = new Person("John", 13);
List<Person> newList = Stream.of(p1, p2, p3, p4, p5)
.collect(Collectors.toList());
System.out.println(newList);
//[Person{name='Tom', age=11}, Person{name='Jack', age=12}, Person{name='Jane', age=15}, Person{name='Mike', age=14}, Person{name='John', age=13}]
フィルタ
フィルターフロー
List<Person> newList = Stream.of(p1, p2, p3, p4, p5)
.filter(p -> p.getAge() > 13)
.collect(Collectors.toList());
System.out.println(newList);
//[Person{name='Jane', age=15}, Person{name='Mike', age=14}]
地図
変換フロー
List<String> newList = Stream.of(p1, p2, p3, p4, p5)
.map(p -> p.getName())
.collect(Collectors.toList());
System.out.println(newList);
//[Tom, Jack, Jane, Mike, John]
flatMap
複数のストリームを1つのストリームに結合する
List<String> newList = Stream.of(p1, p2, p3)
.flatMap(p -> Arrays.stream(p.getName().split("")))
.collect(Collectors.toList());
System.out.println(newList);
//[T, o, m, J, a, c, k, J, a, n, e]
最大&最小
最大値と最小値を取得します
Optional<Person> max = Stream.of(p1, p2, p3, p4, p5)
.max((o1, o2) -> o1.getAge() - o2.getAge());
Optional<Person> min = Stream.of(p1, p2, p3, p4, p5)
.min(Comparator.comparing(p -> p.getAge()));
System.out.println(max.get());
System.out.println(min.get());
//Person{name='Jane', age=15}
//Person{name='Tom', age=11}
カウント
総量
long count = Stream.of(p1, p2, p3, p4, p5)
.filter(p -> p.getAge() > 13)
.count();
System.out.println(count);
//2
減らす
累積計算
Integer reduce = Stream.of(1, 2, 3, 4, 5)
.reduce(0, (acc, x) -> acc + x);
System.out.println(reduce);
//15
Collectors.joining
ストリングスプライシング
String newStr = Stream.of(p1, p2, p3, p4, p5)
.map(p -> p.getName())
.collect(Collectors.joining("-", "[", "]"));
//[Tom-Jack-Jane-Mike-John]