我对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()的示例代码对我的理解很有帮助。
提前致谢。
答案 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> collect
为a terminal operation,预计会返回R
绑定的类型,在这种情况下,会转换为List<Integer>
。这就是它如何正确收集你的元素。
我们鼓励您peruse more information about Collector
,因为它是较新的Java 8 Stream API的一部分,并且一旦您开始就可能有点好奇。