java 8中map方法的语法是:
$kernel = new AppKernel('prod', true);
但我可以使用lambda表达式:
<R> Stream<R> map(Function<? super T,? extends R> mapper)
map方法中的参数如何等同于Function数据类型。请帮我理解这一点。
由于
答案 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>
的上下文中(假设personList
是List<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)
一起在您的流中使用。