lambda表达式如何映射到功能界面?

时间:2017-10-16 12:48:54

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

让我们看看下面的代码。

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

然后我们会查看streams.map的{​​{3}}。 map方法的签名就像这样。

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

有人可以解释一下JVM如何映射我们给出的lambda表达式(name -> name.length()Function<? super T,? extends R> mapper

2 个答案:

答案 0 :(得分:8)

Function需要X并返回Y

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

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

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

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

答案 1 :(得分:2)

apply检查Function方法:

R apply(T t);

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

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