【问题标题】:Why I use "Collectors.toList()" rather than "Collectors::toList" in Java 8 Lambda? [duplicate]为什么我在 Java 8 Lambda 中使用“Collectors.toList()”而不是“Collectors::toList”? [复制]
【发布时间】:2018-07-02 09:25:40
【问题描述】:

通常在flatMap 之后,我们使用collect(Collectors.toList()) 收集数据并返回List

但为什么我不能改用Collectors::toList 呢?我尝试使用它,但出现编译错误。

我试图搜索这个,但找不到任何解释。

非常感谢。

【问题讨论】:

  • Collectors.toList() 返回一个可以使用的收集器,它不是收集器。
  • @Niuhuru,你能在这里发布你的代码吗?这将有助于调试问题。
  • @matt 我认为 OP 的意思是 Collectors.toList() 而不是 Collector.toList() 我认为这是一个错字
  • 我猜编译器会给你一个失败的原因,某种类型的不匹配。
  • 谢谢大家的回复,我的问题已经解决了。非常感谢。

标签: java lambda collectors tolist


【解决方案1】:

请看@Eran 的回答,因为它比我的更详细,但是如果有人想要一个简单的解释:

你不能改变:

collect(Collectors.toList())collect(Collectors::toList)

你只能改变:

collect(() -> Collectors.toList())collect(Collectors::toList)

【讨论】:

  • 感谢您的简单回答,这对我很有用。
【解决方案2】:

您正在调用Stream 接口的<R, A> R collect(Collector<? super T, A, R> collector) 方法。 Collectors.toList() 返回一个Collector<T, ?, List<T>>,它与collect 方法参数的所需类型相匹配。因此someStream.collect(Collectors.toList()) 是正确的。

另一方面,方法引用Collectors::toList不能作为collect方法的参数,因为方法引用只能在需要功能接口的地方传递,而Collector不是功能接口.

您可以将Collectors::toList 传递给需要Supplier<Collector> 的方法。同样,您可以将其分配给这样的变量:

Supplier<Collector<Object,?,List<Object>>> supplierOfListCollector = Collectors::toList;

【讨论】:

  • 对我来说太快了:)
  • 非常感谢您的回答,回答了我的问题
猜你喜欢
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2021-04-18
  • 2015-10-08
  • 2018-01-09
  • 2020-07-11
  • 2018-05-17
相关资源
最近更新 更多