以下代码:
public class Test {
public static void main(String[] args) {
Stream.of(1,2,3).map(String::valueOf).collect(Collectors::toList)
}
}
情报告诉我:
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());
}
}
第一种语法不合法的原因是方法签名所隐含的目标类型-Stream.collect(Collector)
-是Collector
。 Collector
具有多种抽象方法,因此它不是功能接口,并且不能具有@FunctionalInterface
注释。
[方法参考,例如Class::function
或object::method
,只能分配给功能接口类型。由于Collector
不是功能接口,因此无法使用任何方法引用将参数提供给collect(Collector)
。
相反,调用Collectors.toList()
作为函数。显式的<String>
类型参数是不必要的,并且您的“有效”示例在末尾没有括号的情况下将不起作用。这将创建一个可以传递给Collector
的collect()
实例。
Collector
接口具有需要实现的多种方法(combiner()
,finisher()
,supplier()
,accumulator()
),因此它不能成为功能性接口,只能具有一个方法而没有默认实现。
我看不到您的问题与所附代码有什么关系。