[英]java 8 Collector<String, A, R> is not a functional interface, who can tell why?
以下代碼:
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());
}
}
第一種語法不合法的原因是方法簽名所隱含的目標類型—— Stream.collect(Collector)
——是一個Collector
。 Collector
有多個抽象方法,所以不是函數式接口,不能有@FunctionalInterface
注解。
像Class::function
或object::method
這樣的方法引用只能分配給函數式接口類型。 由於Collector
不是函數式接口,因此無法使用方法引用為collect(Collector)
提供參數。
相反,將Collectors.toList()
作為函數調用。 顯式<String>
類型參數是不必要的,如果最后沒有括號,您的“工作”示例將無法工作。 這將創建一個可以傳遞給collect()
的Collector
實例。
Collector
接口有多個方法( combiner()
、 finisher()
、 supplier()
、 accumulator()
)需要一個實現,所以它不能是一個函數式接口,它只能有一個沒有默認實現的方法。
我不明白你的問題與附加的代碼有什么關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.