9

以下代码:

public class Test {
    public static void main(String[] args) {
        Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors::toList);
    }
}

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());
    }
}
4

2 回答 2

11

第一种语法非法的原因是方法签名所隐含的目标类型Stream.collect(Collector)——是一个Collector. Collector有多个抽象方法,所以不是函数式接口,不能有@FunctionalInterface注解。

方法引用喜欢Class::functionobject::method只能分配给功能接口类型。由于Collector不是函数式接口,因此不能使用任何方法引用来向collect(Collector).

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

于 2015-08-20T03:54:26.623 回答
4

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

我看不出您的问题与附加代码有何关系。

于 2015-08-19T11:30:25.693 回答