java 8 Collector <String,A,R>不是一个功能界面,谁可以告诉为什么?

Rol*_*olt 8 java lambda java-8 java-stream collectors

以下代码:

public class Test {
    public static void main(String[] args) {

        Stream.of(1,2,3).map(String::valueOf).collect(Collectors::toList)
    }
}
Run Code Online (Sandbox Code Playgroud)

intellij告诉我:

Collector<String, A, R> 不是功能界面

但是当我按如下方式修改代码时,一切都还可以,我不知道为什么?

public class Test {
    public static void main(String[] args) {

        Stream.of(1,2,3).map(String::valueOf).collect(Collectors.<String>toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

eri*_*son 8

第一种语法非法的原因是方法签名所暗示的目标类型Stream.collect(Collector)- 是a Collector.Collector有多个抽象方法,因此它不是一个功能界面,也不能有@FunctionalInterface注释.

方法引用类似Class::functionobject::method只能分配给功能接口类型.由于Collector不是功能接口,因此不能使用方法引用来提供参数collect(Collector).

相反,Collectors.toList()作为一个函数调用.显式<String>类型参数是不必要的,并且您的"工作"示例在最后没有括号时将不起作用.这将创建一个Collector可以传递给的实例collect().


Era*_*ran 4

Collector接口有多个方法(combiner()finisher()supplier()accumulator())需要一个实现,因此它不能是函数式接口,函数式接口只能有一个方法,没有默认实现。

我不明白你的问题与所附代码有何关系。