java 8 Collector 不是功能接口,谁能告诉原因?

问题描述 投票:8回答:2

以下代码:

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());
    }
}
java lambda java-8 java-stream collectors
2个回答
8
投票

第一种语法不合法的原因是方法签名所隐含的目标类型-Stream.collect(Collector)-是CollectorCollector具有多种抽象方法,因此它不是功能接口,并且不能具有@FunctionalInterface注释。

[方法参考,例如Class::functionobject::method,只能分配给功能接口类型。由于Collector不是功能接口,因此无法使用任何方法引用将参数提供给collect(Collector)

相反,调用Collectors.toList()作为函数。显式的<String>类型参数是不必要的,并且您的“有效”示例在末尾没有括号的情况下将不起作用。这将创建一个可以传递给Collectorcollect()实例。


3
投票

Collector接口具有需要实现的多种方法(combiner()finisher()supplier()accumulator()),因此它不能成为功能性接口,只能具有一个方法而没有默认实现。

我看不到您的问题与所附代码有什么关系。

© www.soinside.com 2019 - 2024. All rights reserved.