使用函数参考的奇怪语法错误

时间:2019-01-20 08:59:14

标签: java eclipse lambda

我有以下代码...

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.

enter image description here

我的Person类声明了一个toString方法。

...我用不同的方式对人进行系统处理。但是最可取的方法是在日食中显示语法错误。在IntelliJ中,我没有得到这个。谁能解释或告诉我我在做什么错?

2 个答案:

答案 0 :(得分:4)

您应该写

Post::whereHas('comments', function($q) { 
    $q->where('active', 1); 
})->get()

这是方法参考。

personmitnamen4.forEach(System.out::println);

这是一个lambda表达式。

您试图传递给personmitnamen4.forEach(p -> System.out.println(p)); 的内容:

forEach

是一个lambda表达式,该函数使用接受p -> System.out::println 并返回与Person兼容的方法引用的方法来实现功能接口,这使lambda表达式与功能接口Consumer<Person>兼容,而不是Function<Person,Consumer<Person>>要求的Consumer<Person>

您可以通过观察以下内容通过编译来进行测试:

forEach

答案 1 :(得分:2)

您应该使用 lambda 或使用方法参考,而不能同时使用两者。

personmitnamen4.forEach(System.out::println); // method reference

personmitnamen4.forEach(p -> System.out.println(p)); // lambda