Lambda表达式java 8映射方法

时间:2018-06-13 11:28:34

标签: lambda java-8

java 8中map方法的语法是:

$kernel = new AppKernel('prod', true);

但我可以使用lambda表达式:

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

map方法中的参数如何等同于Function数据类型。请帮我理解这一点。

由于

5 个答案:

答案 0 :(得分:2)

Function<? super T,? extends R> mapper方法的函数map基本上代表任何带一个参数并返回值的函数,因此在这种特定情况下,lambda p -> new Student(p.getId(), p.getName()) 函数取Person p并返回Student因此非常适合。

以另一种方式来看,lambda相当于:

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

答案 1 :(得分:1)

Stream<Person>的上下文中(假设personListList<Person>),lambda表达式p -> new Student(p.getId(), p.getName())实现了一个接受Person实例的功能接口(Stream的一个元素)并返回Student个实例。

因此它匹配Function<Person,Student>功能接口,这是map()方法所需的接口。

答案 2 :(得分:1)

您可以这样写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());

答案 3 :(得分: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());
    }
})

答案 4 :(得分: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)一起在您的流中使用。