代码之家  ›  专栏  ›  技术社区  ›  mcfly soft

使用函数引用时出现奇怪的语法错误

  •  3
  • mcfly soft  · 技术社区  · 7 年前

    我有以下代码…

    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 方法已声明。

    …在那里我以不同的方式安排人。但最可取的方法是向我展示Eclipse中的语法错误。在Intellij中,我不明白这一点。有人能解释或告诉我我这里做错了什么吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Eran    7 年前

    你也应该写

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

    这是一个方法参考。

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

    它是lambda表达式。

    你试图传递给 forEach :

    p -> System.out::println
    

    是一个lambda表达式,该表达式使用接受 Person 并返回与兼容的方法引用 Consumer<Person> 使lambda表达式与函数接口兼容 Function<Person,Consumer<Person>> ,这不是 消费者<个人> 要求 前额 .

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

    Function<Person,Consumer<Person>> foo = p -> System.out::println;
    
        2
  •  2
  •   Naman    7 年前

    你应该使用 兰姆达 或使用 方法参考 不是同时两个。

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