Collectors.toList()返回的收集器类型

时间:2017-08-16 03:59:10

标签: java java-8

我对Collectors.toList()和Collectors.toSet()静态方法感到很困惑。这两种方法不涉及任何参数。那么他们如何知道要返回的收集器类型呢?

例如,如果我们有这一行:

Collectors.toList();

返回的收集器为Collector<Object,?,List<Object>>

如果我们有这一行:

Collector<Integer,?,List<Integer>> c = Collectors.toList();

然后Collectors.toList()将返回Collector<Integer,?,List<Integer>>。如果不接受任何输入参数,toList()方法如何知道它需要返回Collector<Integer,?,List<Integer>>

也许编写toList()的示例代码对我的理解很有帮助。

提前致谢。

2 个答案:

答案 0 :(得分:4)

此功能在通用类型推断中以target type引入。

  

Java编译器利用目标类型来推断泛型方法调用的类型参数。表达式的目标类型是Java编译器所期望的数据类型,具体取决于表达式的显示位置。

例如:

//         v--- the generic parameter `T` is inferred by the target type 
Collector<Integer,?,List<Integer>> c = Collectors.toList();

//         v--- the unbounded type parameter is extends `Object`
Collectors.toList();

答案 1 :(得分:0)

假设您想要将偶数整数列表收集到另一个列表中。

你可以这样写:

// assume that integerList contains ints between 1 and 20
List<Integer> evenInts = integerList.stream().filter(x -> x % 2 == 0)
                                             .collect(Collectors.toList());
流中的{p> collecta terminal operation,预计会返回R绑定的类型,在这种情况下,会转换为List<Integer>。这就是它如何正确收集你的元素。

我们鼓励您peruse more information about Collector,因为它是较新的Java 8 Stream API的一部分,并且一旦您开始就可能有点好奇。