Лямбда-выражение метод java 8 map - PullRequest
0 голосов
/ 13 июня 2018

Синтаксис метода карты в Java 8:

<R> Stream<R> map(Function<? super T,? extends R> mapper)

, но я могу использовать лямбда-выражение:

personList.stream().filter(p -> p.getPersonType().equals("student"))
            .map(p -> new Student(p.getId(), p.getName()))
            .collect(Collectors.toList());

Как аргумент в методе карты приравнивается к функцииdatatype. Пожалуйста, помогите мне понять это.

Спасибо

Ответы [ 4 ]

0 голосов
/ 13 июня 2018

Во время выполнения следующее лямбда-выражение:

p -> new Student(p.getId(), p.getName())

будет представлено классом, реализующим интерфейс Function<T, R>.

Экземпляр этого функционального интерфейса можно передать какпараметр Stream.map(...) метод:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

Чтобы лучше понять, как это работает, можно заменить лямбду на старый добрый анонимный класс, который реализует соответствующий интерфейс.

.map(p -> new Student(p.getId(), p.getName())) эквивалентно:

.map(new Function<Person, Student>() {
    @Override
    public Student apply(Person p) {
        return new Student(p.getId(), p.getName());
    }
})
0 голосов
/ 13 июня 2018

В контексте вашего Stream<Person> (при условии, что personList является List<Person>), лямбда-выражение p -> new Student(p.getId(), p.getName()) реализует функциональный интерфейс, который принимает экземпляр Person (элемент вашего Stream) ивозвращает экземпляр Student.

Следовательно, он соответствует функциональному интерфейсу Function<Person,Student>, который является интерфейсом, необходимым для метода map().

0 голосов
/ 13 июня 2018

Вы можете написать так Function<Person,Student> function = p -> new Student(p.getId(), p.getName())

, так как вы видите, что это представляет функцию.

personList.stream().filter(p -> p.getPersonType().equals("student"))
        .map(function::apply) // p -> function.apply(p)
        .collect(Collectors.toList());
0 голосов
/ 13 июня 2018

Функция Function<? super T,? extends R> mapper метода map в основном представляет собой любую функцию, принимающую один параметр и возвращающую значение, поэтому в данном конкретном случае лямбда p -> new Student(p.getId(), p.getName()) является функцией , принимающей Person pи возвращая Student, следовательно, отлично вписывается в это.

Если посмотреть по-другому, лямбда эквивалентна:

.map(new Function<Person, Student>() {
     @Override
      public Student apply(Person p) {
            return new Student(p.getId(), p.getName());
      }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...