我目前正在阅读Oracle的Java教程。
在关于Lambda表达式(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)的章节中,我不太了解方法7/8中mapper参数的用途以及方法9中map方法的用法。
方法7:
public static void printPersonsWithPredicate(
List<Person> roster, Predicate<Person> tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
接近8:
public static <X, Y> void processElements(
Iterable<X> source,
Predicate<X> tester,
Function <X, Y> mapper,
Consumer<Y> block) {
for (X p : source) {
if (tester.test(p)) {
Y data = mapper.apply(p);
block.accept(data);
}
}
}
接近9:
roster
.stream()
.filter(
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25)
.map(p -> p.getEmailAddress())
.forEach(email -> System.out.println(email));
无法忽略这一点,并将lambda表达式email -> System.out.println(email)
替换为p -> System.out.println(p.getEmailAddress())
(在调整相应的数据类型之后)。
是否有人提示或想法为什么在这些示例中引入了map方法/映射器参数,或者看到了我考虑的缺陷?
谢谢你 问候 马丁答案 0 :(得分:2)
方法8上的映射器函数:
Function <X, Y> mapper
是一个函数,它将引用类型X
作为输入,并返回另一个引用类型Y
作为输出。如果你在方法8的if
陈述的正文中仔细查看,则表明:
Y data = mapper.apply(p);
这是执行mapper
正在引用并返回结果的行为。
对于你不能做的最后一种方法:
p -> System.out.println(p.getEmailAddress())
因为当时我们有Stream<String>
而不是Stream<Person>
但是,如果您指的是忽略对map
的调用并将forEach
行为参数化 n替换为p -> System.out.println(p.getEmailAddress())
,则表示是也工作。
有没有人有一个提示或想法为什么map方法/ mapper 在这些例子中引入了参数或者看到了我的缺陷 考虑?
此示例中引入了map
方法,因为作者希望打印包含在集合roster
中的成员的电子邮件地址,这些成员有资格获得选择性服务,如您所提及的链接中所述#39;发布了。所以为了做到这一点,我们可以将Stream<Person>
映射到Stream<String>
或使用您建议的其他方法。