【问题标题】:Type of Collector returned by Collectors.toList()Collectors.toList() 返回的收集器类型
【发布时间】:2018-01-24 02:03:23
【问题描述】:

我对 Collectors.toList() 和 Collectors.toSet() 静态方法感到很困惑。这两种方法不接受任何参数。那么他们怎么知道要返回什么类型的 Collector 呢?

例如,如果我们有这行:

Collectors.toList();

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

如果我们有这一行:

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

然后 Collectors.toList() 将返回一个Collector&lt;Integer,?,List&lt;Integer&gt;&gt;。在不接受任何输入参数的情况下,toList() 方法如何知道它需要返回一个Collector&lt;Integer,?,List&lt;Integer&gt;&gt;

也许如何编写 toList() 的示例代码将有助于我的理解。

提前致谢。

【问题讨论】:

标签: java java-8


【解决方案1】:

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

你可以这样写:

// assume that integerList contains ints between 1 and 20
List<Integer> evenInts = integerList.stream().filter(x -> x % 2 == 0)
                                             .collect(Collectors.toList());

collect 在流中是a terminal operation,它应该返回一个由R 绑定的类型,在这种情况下,它转换为List&lt;Integer&gt;。这就是它能够适当地收集您的元素的方式。

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

【讨论】:

  • 你没有回答我的问题。我确实知道如何使用 Collectors.toList() 并且实际上已经编写了我自己的收集器。
  • @user3573403 如果您继续阅读,您会发现我确实解决了您的具体问题。答案取决于类型是如何绑定的,R 是用作返回值的类型。
【解决方案2】:

此功能在泛型类型推断中以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();

【讨论】:

  • 你能展示一些关于如何实现 toList() 的代码吗?
  • @user3573403 类型推断是由 java 编译器而不是 java 源代码实现的。如果你把代码改成Collector&lt;Integer,?,List&lt;String&gt;&gt; c = Collectors.toList();,你会发现代码无法编译,因为toList()方法只包含单一类型参数T
  • @user3573403 嗨,target type 中有一个完整的示例。并且java8完全支持泛型调用的目标类型表达式。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多