【问题标题】:java 8 Collector<String, A, R> is not a functional interface, who can tell why?java 8 Collector<String, A, R> 不是函数式接口,谁能告诉我为什么?
【发布时间】:2015-11-12 16:11:35
【问题描述】:

以下代码:

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

IntelliJ 告诉我:

Collector&lt;String, A, R&gt; 不是功能接口

但是当我如下修改代码时,一切正常,不知道为什么?

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


    【解决方案1】:

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

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

    【讨论】:

    • 我认为他们打算使用Collectors.toList()
    【解决方案2】:

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

    Class::functionobject::method 这样的方法引用只能分配给功能接口类型。由于Collector 不是函数式接口,因此不能使用任何方法引用来为collect(Collector) 提供参数。

    改为将Collectors.toList() 作为函数调用。显式的 &lt;String&gt; 类型参数是不必要的,并且您的“工作”示例在末尾没有括号将无法工作。这将创建一个Collector 实例,该实例可以传递给collect()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2016-11-21
      • 2021-03-23
      相关资源
      最近更新 更多