Java:教程示例中mapper / map的用途

时间:2017-11-04 14:04:04

标签: java lambda java-stream

我目前正在阅读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方法/映射器参数,或者看到了我考虑的缺陷?

谢谢你 问候 马丁

1 个答案:

答案 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>或使用您建议的其他方法。