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

Thr*_*ion 2 java java-8 java-stream method-reference collectors

有人可以建议,为什么我不能在这里应用方法参考?

工作代码。

System.out.println(
                Arrays.stream(str.split(" "))
                        .collect(Collectors.groupingBy(Function.identity(),Collectors.counting())));  
Run Code Online (Sandbox Code Playgroud)

编译错误,无法解析方法

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

JB *_*zet 7

因为groupingBy()期望 a Function,即接受一个参数并返回一些东西的东西。

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

但是Function::identity 引用identity()不带任何参数的方法,因此不能用作函数。

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

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