方法引用在流的收集方法中不起作用

问题描述 投票:0回答:1

我正在尝试对列表中的元素进行排序,并使用 java 8 流将其收集并打印在单独的列表中,下面是代码。

工作代码:

System.out.println(coursesList.stream()
        .sorted(comparingByNoOfStudents).collect(Collectors.toList()));

但是当它尝试与引用方法相同时,会出现错误:

 System.out.println(coursesList.stream()
        .sorted(comparingByNoOfStudents).collect(Collectors::toList));

以下是讯息:

java: no suitable method found for collect(Collectors::toList)
    method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super com.java.functional.basic.Courses>,java.util.function.BiConsumer<R,R>) is not applicable
      (cannot infer type-variable(s) R
        (actual and formal argument lists differ in length))
    method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super com.java.functional.basic.Courses,A,R>) is not applicable
      (cannot infer type-variable(s) R,A
        (argument mismatch; java.util.stream.Collector is not a functional interface
          multiple non-overriding abstract methods found in interface java.util.stream.Collector))
java lambda java-8 java-stream
1个回答
1
投票

是的,当然。您需要将收集器传递给

collect
。不是“可以创建收集器的方法”,而是传递收集器

方法引用是这样说的:不要调用该方法 - 相反,我希望将方法调用的概念作为我可以移交的东西,以便其他人可以实际调用它。

采用

.sorted
方法,如果您提供一个函数来告诉您任意 2 个元素中哪一个是“较早的”元素,它可以为您排序。您不想运行“a 或 b 哪个更早?”方法,你想把它交出去。

这就是 lambda(

->
语法)和方法引用(
x -> invokeThatMethod(x)
的简写)的用途。
collect
方法永远不需要一个。

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