如何理解此Java 8 Stream collect()方法?

use*_*158 11 java list java-8 java-stream collectors

我试图将一个int数组转换为List,并且采取了使用Java 8 Stream的陌生路线,并提出了这个建议。

Arrays.stream(arr).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我仍然很难完全理解这条线,

  1. 为什么Collectors.toList()在这种情况下返回一个ArrayList<Integer>实现List接口?为什么不LinkedList<Integer>符合List接口的通用类呢?我找不到这事,除了简短提的ArrayList 这里,在API说明部分。

  2. 的左面板是什么 在此处输入图片说明 Stream.collect()意思?显然R是通用返回类型(ArrayList<Integer>在我的代码中)。而且我认为<R, A>是该方法的泛型类型参数,但是如何指定它们呢?我查看了Collector界面文档,但无法吸收它。

And*_*cus 14

  1. 这是默认实现。ArrayList之所以使用,是因为它在大多数情况下都是最好的,但是如果不适合您,则可以随时定义自己的收集器并为Collection您提供所需的工厂:

    Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 是的,A并且R是此方法的通用参数,R是返回类型,T输入类型和A中间类型,在收集元素的整个过程中都会出现(可能不可见并且与该功能无关)。您提供的javadoc的开头定义了这些类型(它们在整个文档中都是一致的):

T-归约运算的输入元素的类型

A-归约运算的可变累积类型(通常隐藏为实现细节)

R-归约运算的结果类型

  • @ user3207158该方法返回一个“列表”,因此无论使用哪种实现,其行为都是相同的。在较新版本的Java中不太可能会更改接口。 (2认同)