我有以下代码...
List<Person> personenListe = Arrays.asList(new Person[] {person1, person2,person3,person4});
List<Person> personmitnamen4 = personenListe.stream().filter(p -> p.getName().equals("name4")).collect(Collectors.toList());
personmitnamen4.forEach(p -> System.out.println(p));
personmitnamen4.forEach(new Consumer<Person>() {
@Override
public void accept(Person p) {
// TODO Auto-generated method stub
System.out.println(p);
}
});
personmitnamen4.forEach(p -> System.out::println); // <- the target type of this expression must be a functional interface.
我的 Person
类声明了一个 toString
方法。
...我以不同的方式对人进行系统分析。但最好的方法是在 Eclipse 中显示语法错误。在 IntelliJ 中我不明白这一点。谁能解释或告诉我我在这里做错了什么?
最佳答案
你应该写其中之一
personmitnamen4.forEach(System.out::println);
这是一个方法引用。
或
personmitnamen4.forEach(p -> System.out.println(p));
这是一个 lambda 表达式。
您尝试传递给 forEach
的内容:
p -> System.out::println
是一个 lambda 表达式,它使用接受 Person
的方法来实现函数接口(interface)。并返回与 Consumer<Person>
兼容的方法引用,这使得 lambda 表达式与函数接口(interface) Function<Person,Consumer<Person>>
兼容。 ,这不是 Consumer<Person>
forEach
要求.
您可以通过观察以下内容是否通过编译来测试它:
Function<Person,Consumer<Person>> foo = p -> System.out::println;
关于java - 使用函数引用时出现奇怪的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274931/