2017-10-16 81 views
8

让我们看看下面的代码。lambda表达式如何映射到函数接口?

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

,只需再将着眼于为javadocstreams.map。这里出现map方法的签名。

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

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

+2

你想完成什么?您不需要创建Stream类型的局部变量。你在寻找'names.stream()。map(...)。collect(Collectors.toList())'?另外,不要使用原始的List类型。 – Michael

+0

@Michael实际上我需要观众专注于lambda表达式部分。所以我没有添加你提到的后面的增加。这只是为了理解lambda到功能接口的映射。没有其他的。 :)) –

+1

@迈克尔明白你的观点。谢谢。 :))希望我已经纠正了代码。 –

回答

8

A Function是需要X并返回Y

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

基本上与name -> name.length()您与重写一个抽象方法R apply(T t)实施@FunctionlInterface Function<T,R>

您也可以缩短与方法参考:

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

检查从Functionapply方法:

R apply(T t); 

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

由于Function类只有一个非默认的public方法,它c你的lambda地图Function实例