странная синтаксическая ошибка при использовании ссылки на функцию - PullRequest
0 голосов
/ 20 января 2019

У меня есть следующий код ...

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 голосов
/ 20 января 2019

Вы должны либо использовать лямбда , либо использовать ссылку на метод , но не оба одновременно.

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

personmitnamen4.forEach(p -> System.out.println(p)); // lambda
0 голосов
/ 20 января 2019

Вы должны написать либо

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

, который является ссылкой на метод.

или

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

, которое является лямбда-выражением.

То, что вы пытались передать forEach:

p -> System.out::println

является лямбда-выражением, реализующим функциональный интерфейс с методом, который принимает Person и возвращает ссылку на метод, совместимый с Consumer<Person>, что делает лямбда-выражение совместимым с функциональным интерфейсом Function<Person,Consumer<Person>>, который не является Consumer<Person> требуется forEach.

Вы можете проверить это, заметив, что следующее пройдет компиляцию:

Function<Person,Consumer<Person>> foo = p -> System.out::println;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...