让我们看看下面的代码。
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
?
答案 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
实例