web-dev-qa-db-ja.com

これを理解するにはJava 8 Stream collect()メソッド?

私はint配列をListに変換しようとしていましたが、Java 8 Streamを使用するという馴染みのないルートを使用し、これを思いつきました

_Arrays.stream(arr).boxed().collect(Collectors.toList());
_

私はまだこの行を完全に理解するのにまだ苦労しています、ほとんどが、

  1. この場合、Collectors.toList()が_ArrayList<Integer>_実装Listインターフェースを返すのはなぜですか? _LinkedList<Integer>_またはListインターフェースに準拠する他のジェネリッククラスを使用しないのはなぜですか? APIノートセクションでArrayList here の簡単な説明を除いて、これについては何も見つかりません。

  2. の左側のパネルは何ですかenter image description hereStream.collect()はどういう意味ですか?明らかにRは一般的な戻り値の型です(私のコードでは_ArrayList<Integer>_)。そして、私は_<R, A>_がメソッドのジェネリック型引数であると思いますが、それらはどのように指定されますか? Collector インターフェースドキュメントを調べましたが、吸収できませんでした。

12
user3207158
  1. この場合Collectors.toList()がListインターフェースを実装するArrayListを返すのはなぜですか?

メソッド定義が示唆するように、それはArrayListとしてコレクターサプライヤーを持つコレクター実装を返します。したがって、以下のメソッド定義から、_Collectors.toList_が常にArrayList collector(_While it's arguable why toList not toArrayList Word is used in method name_)を返すことは非常に明確です。

_public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
_
  1. <R, A> R collect(Collector<? super T, A, R> collector)の左パネルの意味

ドキュメンテーションコメントを参照すると、これらのジェネリック型が何であるかが正確に示されています。

_/*
      @param <R> the type of the result
      @param <A> the intermediate accumulation type of the {@code Collector}
      @param collector the {@code Collector} describing the reduction
      @return the result of the reduction
*/
 <R, A> R collect(Collector<? super T, A, R> collector);
_
1
Vinay Prajapati