1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Stream APIメモ

Last updated at Posted at 2019-02-13

Java 8で追加されたAPIの一つで、ラムダ式などの関数型プログラミングを記述できるようになる。

Streamはコレクションやリストなどを一か所に集めて、ごにょごにょ処理ができるようになる。その際に、中間処理や終端処理を終えると処理された結果を返すことで、 より自分が使いやすいデータとして扱えるようになる。

Streamの例

ElasticSearchのソースコードに

this.registry = new NamedXContentRegistry(
    Stream.of(getDefaultNamedXContents().stream(), getProvidedNamedXContents().stream(), namedXContentEntries.stream())
        .flatMap(Function.identity()).collect(toList()));   

のコードを見てて、なんとなくこれは何かしらのリストのようなものを集めて最終的にリストで返しているんだなーってくらいに思って眺めてたけど、勉強のためにもう少し深く理解するために少し調べてみた。

stream()

List型などにあるメソッド。Stream型で使えるようにStream型を生成するメソッド。

Arrays.asList("one", "two", "three").stream();
Arrays.asList(new Moment(), new Moment(), new Moment(), new Moment()).stream();

Stream.of()

Stream型にしたリストなどを一気にまとめられるメソッド。

List<String> numbers = Arrays.asList("one", "two", "three");
Stream.of(numbers.stream(), numbers.stream(), numbers.stream());

flatMap()

まとめたリストを一個のリストにまとめるメソッド。このメソッドの中でforEachなどを使って処理を記述できる。

Stream.of(list1.stream(), list1.stream(), list1.stream())
    .flatMap(t -> t).forEach(t -> System.out.println(t));  // "one", "two", "three", "one", "two", "three", "one", "two", "three"

Stream.of(list1.stream(), list1.stream(), list1.stream())
    .forEach(t -> System.out.println(t));  // reference values

Function.identity()

値をそのまま返すメソッド。最初は何でこんなものがあるかと思ったけど、t -> tのような書き方を メソッドやFunction::identityみたいに記述できたほうが読みやすいっていう理由が多かった。

Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity());

このstackoverflowがわかりやすかった。

collect()

ストリームの終端処理でCollectors型で返してくれるメソッド。そのメソッド内でさらに返す型(リストなど)を決められる。

Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity())
    .collect(~);

Collectors.toList()

Collectors型をList型で返すメソッド。これをcollectメソッド内で使うことができる。

Stream.of(numbers.stream(), numbers.stream(), numbers.stream())
    .flatMap(Funcion.indentity())
    .collect(toList());

最初のコードの説明

this.registry = new NamedXContentRegistry(
    Stream.of(getDefaultNamedXContents().stream(), getProvidedNamedXContents().stream(), namedXContentEntries.stream())
        .flatMap(Function.identity()).collect(toList()));     

最初に戻って、上のコードが何をしているかというと、List型をStream型にしてからStream.ofでまとめて、flatMapを使用することでListの中身を一つにし、そのあとにcollectでCollectors型にして、その中でtoListで最終的にList型にして返してることになる(長い)。

リストって表現じゃなくてコレクションのほうが良かったかもしんない。

1
3
0

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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?