ところでJavaをアップデートしたのでREPLでやります。
コンソールでjshellと打つだけで(java9以上?)
jshell>
だぜやっほう!
#二つのStreamをつなげる時はconcat
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@1f36e637
jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@578486a3
jshell> Stream.concat(streamA, streamB).forEach(System.out::println);
1
2
3
4
5
見た感じ、concatは引数が二つのものしかありません?
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#concat-java.util.stream.Stream-java.util.stream.Stream-
#三つ以上はflatMapの出番やで
そもそもstreamの性質上つなげる操作で困ることなかったんや。素直に行こうや。
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@536aaa8d
jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@e320068
jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@1f57539
jshell> Stream.of(streamA, streamB, streamC).flatMap(Function.identity()).forEach(System.out::println);
1
2
3
4
5
6
7
8
9
#jshellを途中で改行するやり方が分からないお...
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@27a8c74e
jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@2d8f65a4
jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@1b68ddbd
jshell> Stream.of(streamA, streamB, streamC).
...> flatMap(Function.identity()).
...> forEach(System.out::println);
1
2
3
4
5
6
7
8
9
このやり方が私の限界だった。何かわかったら追記する(かも)。ていうか最後にピリオド気持ち悪い。いや、自然言語ではこれが通常運転なんだけど。
#reduceの役立たず!もう嫌い!
わかると思うんだけど、reduceするとoptionalになって二度手間なんだYO
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@2781e022
jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@57e1b0c
jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@4232c52b
jshell> Stream.of(streamA, streamB, streamC).
...> reduce(Stream::concat)
$38 ==> Optional[java.util.stream.ReferencePipeline$Head@ea1a8d5]
今日はここまで。少しずつ続けることが大事だと自分に言い聞かせる。
#追記: swordoneさんよりご指摘
"reduceがOptionalになるのが嫌なら、3引数のreduceを使えばいいじゃない。"
Stream.of(streamA, streamB, streamC).reduce(Stream.empty(), Stream::concat, Stream::concat);
おっしゃる通りございます。
いや、でもそれならもはや引数2のreduceでいいんじゃね?
Stream.of(streamA, streamB, streamC).reduce(Stream.empty(), Stream::concat)
reduceの話はベッケンバウアーで。