java - 为什么我不能将 Function.identity 引用为收集器中的方法引用

标签 java java-8 java-stream collectors method-reference

有人可以建议一下,为什么我无法在此处应用方法引用?

工作代码。

System.out.println(
                Arrays.stream(str.split(" "))
                        .collect(Collectors.groupingBy(Function.identity(),Collectors.counting())));  

编译错误,无法解析方法

System.out.println(
            Arrays.stream(str.split(" "))
                    .collect(Collectors.groupingBy(Function::identity,Collectors::counting)));

最佳答案

因为 groupingBy() 需要一个 Function,即接受单个参数并返回某些内容的东西。

Function.identity() 返回一个函数。

但是 Function::identity 引用 identity() 方法,该方法不接受任何参数,因此不能使用作为一个函数。

类似地,groupingBy() 需要一个 Collector 实例作为其第二个参数。 Collectors.counting() 返回一个收集器。所以你可以使用它。但是 Collector::counting 引用了 counting() 方法,并且不带参数的单个方法根本不足以提供 Collector 接口(interface)的实现,该接口(interface)有 5 个方法。

以汽车为例,如果您调用需要车辆的方法,则可以调用 Garage.getCar() 来获取汽车并将返回的汽车作为参数传递。但是传递 garage::getCar 是没有意义的,因为那将是“能够给你一辆车的东西”。这不符合车辆的资格。

关于java - 为什么我不能将 Function.identity 引用为收集器中的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59697390/

相关文章:

java - 保存图表时 GWT Autobean 卡住

java - 如何取消 Java 8 可完成的 future ?

xsd - 出现错误 无法加载架构 abc.xsd。 IllegalArgumentException : The resource path def. xsd 已规范化为无效的 null

Java流: group and sort by a previous mapping result?

java - 流图签名

java - Apache Jena - 一次查询得到 3 个相同的结果

java - 如何将数组的元素相加到目标数?

java - 在 Java 中实现命令模式的问题

java - 多行 lambda

Java 8 Stream 添加元素到列表和求和