【问题标题】:How a lambda expression maps into a functional interface?lambda 表达式如何映射到函数式接口?
【发布时间】:2017-10-16 12:48:54
【问题描述】:

让我们看看下面的代码。

    List<String> names = Arrays.asList("Adam", "Brian", "Supun");
    List<Integer> lengths = names.stream()
                                 .map(name -> name.length())
                                 .collect(Collectors.toList());

然后简单地查看javadocstreams.mapmap 方法的签名如下所示。

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

有人可以解释一下 JVM 是如何将我们给出的 lambda 表达式 (name -&gt; name.length()) 映射为 Function&lt;? super T,? extends R&gt; mapper 的吗?

【问题讨论】:

  • 你想完成什么?您永远不需要创建 Stream 类型的局部变量。您在寻找names.stream().map(...).collect(Collectors.toList()) 吗?另外,不要使用原始的 List 类型。
  • @Michael 实际上我需要观众专注于 lambda 表达式部分。所以我没有添加你提到的后面的添加。这只是为了理解 lambda 到函数式接口的映射。没有其他的。 :))
  • @Michael 明白了。谢谢。 :)) 希望我已经更正了代码。

标签: java lambda functional-programming java-8 java-stream


【解决方案1】:

Function 是接受 X 并返回 Y 的东西。

 ? super T     == String
 ? extends R   == Integer

基本上使用name -&gt; name.length(),您正在实现@FunctionlInterface Function&lt;T,R&gt;,并覆盖单个抽象方法R apply(T t)

您也可以使用方法参考来缩短它:

Stream<Integer> lengths = names.stream().map(String::length);

【讨论】:

    【解决方案2】:

    Function检查apply方法:

    R apply(T t);
    

    ? extends R 是返回类型,? super T 是采取类型

    由于Function 类只有一个非默认public 方法,它可以将您的lambda 映射到Function 实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多