2017-01-14 2 views
1

Я пытаюсь обернуть голову концепциями Java 8. В контексте ссылок на методы я хотел бы знать, как метод фильтра потока, который принимает объект «Предикативный предикат» в моем случае, также может принимать статический метод в том же классе. Пример ниже.Ссылки на статические методы Java 8

public class App 
{ 
    public static void main(String[] args) 
    { 
     List<Integer> intList = Arrays.asList(1,2,3,4,5); 
     intList.stream().filter(e -> e > 3).forEach(System.out::println); 

     intList.stream().filter(App::filterNosGrt3).forEach(System.out::println); 

    } 


    public static boolean filterNosGrt3(Integer no) 
    { 
     if(no>3) 
      return true; 
     else 
      return false; 
    } 
} 

Что меня смущает в отличие от Lambda, которая является объектом сама по себе, статический метод не имеет объект, присоединенный к нему. Итак, как он удовлетворяет методу фильтра здесь.

Благодаря

+1

Не записывайте 'if (no> 3) return true; else return false; 'Просто напишите' return no> 3; '... – Holger

ответ

1

Когда вы пишете

intList.stream().filter(App::filterNosGrt3).forEach(System.out::println); 

вы эффективно писать:

intList.stream().filter(e -> App.filterNosGrt3(e)).forEach(System.out::println); 

Это просто особенность ссылок метода. От Java method references tutorial:

Вы используете лямбда-выражения для создания анонимных методов. Иногда, однако, выражение лямбда ничего не делает, кроме вызова существующего метода. В таких случаях часто бывает проще обращаться к существующему методу по имени. Ссылки на методы позволяют вам это сделать; это компактные, легко читаемые лямбда-выражения для методов, которые уже имеют имя.

...

Метод ссылка Person::compareByAge семантически такой же, как лямбда-выражения (a, b) -> Person.compareByAge(a, b). Каждый из них имеет следующие характеристики:

  • Его формальный список параметров копируется из Comparator<Person>.compare, который (Person, Person).
  • Его тело называет метод Person.compareByAge.
Смежные вопросы