Как проверить Predicate со ссылкой на метод внутри forEach java 8 - PullRequest
3 голосов
/ 29 января 2020

Я пробую ссылку на метод внутри forEach

private static void printConditionally8(List<Person> people, Predicate<Person> predicate) {
    people.forEach(p-> { if (predicate.test(p)){
        System.out.println("Print here");}
    });
}

Выше работает нормально, но я хочу сделать его более кратким, используя ссылку на методы, однако это дает проблему компиляции. Есть ли способ заставить это произойти?

private static void printConditionally8(List<Person> people, Predicate<Person> predicate) {
    people.forEach({ if (predicate::test){
        System.out.println("Print here");}
     });
}

Ответы [ 2 ]

7 голосов
/ 29 января 2020

Вы должны быть в состоянии отфильтровать список перед выполнением вашего действия:

people.stream().filter(predicate).forEach(p -> System.out.println("Print here"));

Вы не можете использовать if(predicate::test), потому что if принимает логическое выражение (тип predicate::test willn ' даже не быть известным здесь - проверьте документацию целевой типизации лямбда-выражений). Единственный способ заставить его работать - это вызвать метод test(), как вы делали это в своем первом фрагменте.

1 голос
/ 29 января 2020

Я думаю, вы используете неправильную концепцию ссылки на метод.

Ссылка на метод - это отличный синтаксис для вызова метода, как если бы он был лямбда-выражением (java 8+ выполнит все преобразования):

Вот пример:

public class Foo {



   private static void printConditionally8(List<Person>persons, Predicate<Person> f) {
      persons.stream().filter(f).forEach(p -> System.out.print(p + " is here"));
   }
   private static Boolean myFilter(Person p) {
      return p.age > 18; 
   }

   public static void main(String[] args) {
      List<Person> persons = ... // create a list of persons
      printConditionally8(persons, Foo::myFilter); 
   } 

}

Обратите внимание, как основной метод действительно вызывает printConditionally8. Он передает ссылку на метод myFilter как «анонимный класс», который реализует интерфейс Predicate.

...