我正在尝试对列表中的元素进行排序,并使用 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))
是的,当然。您需要将收集器传递给
collect
。不是“可以创建收集器的方法”,而是传递收集器。
方法引用是这样说的:不要调用该方法 - 相反,我希望将方法调用的概念作为我可以移交的东西,以便其他人可以实际调用它。
采用
.sorted
方法,如果您提供一个函数来告诉您任意 2 个元素中哪一个是“较早的”元素,它可以为您排序。您不想运行“a 或 b 哪个更早?”方法,你想把它交出去。
这就是 lambda(
->
语法)和方法引用(x -> invokeThatMethod(x)
的简写)的用途。 collect
方法永远不需要一个。