【问题标题】:Lambda expression java 8 map methodLambda 表达式 java 8 映射方法
【发布时间】:2018-06-13 11:28:34
【问题描述】:

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 数据类型。请帮助我理解这一点。

谢谢

【问题讨论】:

  • 你可以这样写Function&lt;Person,Person&gt; function = p -&gt; new Student(p.getId(), p.getName())

标签: lambda java-8


【解决方案1】:

map 方法的函数Function&lt;? super T,? extends R&gt; mapper 基本上代表任何采用一个参数并返回一个值的函数,因此在这种特定情况下,lambda p -&gt; 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());
      }
})

【讨论】:

【解决方案2】:

你可以这样写Function&lt;Person,Student&gt; function = p -&gt; 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】:

    Stream&lt;Person&gt; 的上下文中(假设personListList&lt;Person&gt;),lambda 表达式p -&gt; new Student(p.getId(), p.getName()) 实现了一个函数接口,该接口接受Person 实例(Stream 的一个元素)和返回一个Student 实例。

    因此匹配Function&lt;Person,Student&gt;功能接口,也就是map()方法所需要的接口。

    【讨论】:

      【解决方案4】:

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

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

      将由实现Function&lt;T, R&gt;接口的类表示。

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

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

      为了更好地理解其工作原理,可以将 lambda 替换为一个很好的旧匿名类,该类实现了相应的接口。

      .map(p -&gt; new Student(p.getId(), p.getName())) 等价于:

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

      【讨论】:

        【解决方案5】:

        与@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) 在您的信息流中使用它。

        【讨论】:

          猜你喜欢
          • 2015-07-05
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-14
          • 1970-01-01
          • 2015-06-01
          相关资源
          最近更新 更多