Java 8中的Lambda表达式和Map方法

9

Java 8 中 map 方法的语法如下:

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

但我可以使用Lambda表达式:
personList.stream().filter(p -> p.getPersonType().equals("student"))
            .map(p -> new Student(p.getId(), p.getName()))
            .collect(Collectors.toList());

map方法中的参数是如何等同于函数数据类型的?请帮我理解这个问题。

谢谢。


你可以这样写:Function<Person,Person> function = p -> new Student(p.getId(), p.getName()) - Hadi J
5个回答

8
map方法中的Function<? super T,? extends R> mapper函数代表任何具有一个参数并返回值的函数,因此在这种情况下,lambda表达式p -> new Student(p.getId(), p.getName())是接受一个Person类型的参数并返回一个Student类型的函数,因此完美地适合该函数。

换句话说,该lambda表达式等效于:

.map(new Function<Person, Student>() {
     @Override
      public Student apply(Person p) {
            return new Student(p.getId(), p.getName());
      }
})

2
当我卡在这里时,我发现这篇解释 https://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood 也非常有帮助。 - jayendra bhatt

2

你可以像这样编写代码 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());

1
在运行时,以下 lambda 表达式:

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

将由实现Function<T, R>接口的类来表示。

该功能接口的实例可以作为参数传递给Stream.map(...)方法:

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

为了更好地理解这个过程,可以用实现相应接口的旧匿名类替换lambda表达式。 .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());
    }
})

1
在您的Stream<Person>上下文中(假设personList是一个List<Person>),lambda表达式p -> new Student(p.getId(), p.getName())实现了一个函数接口,该接口接受一个Person实例(您Stream的一个元素)并返回一个Student实例。
因此,它与Function<Person,Student>函数接口匹配,这是map()方法所需的接口。

0

和 @Ousmane D. 一样,但是不是这样:

.map(new Function<Person, Student>() {
     @Override
      public Student apply(Person p) {
            return new Student(p.getId(), p.getName());
      }
})

试试这个:

Function<Person, Student> f = p -> new Student(p.getId(), p.getName());

然后使用.map(f)在您的流中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接