LoginSignup
0
1

More than 5 years have passed since last update.

複数のStreamを繋げる操作@Java

Last updated at Posted at 2018-06-19

ところで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の話はベッケンバウアーで。

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1