Во время выполнения следующее лямбда-выражение:
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());
}
})