Reputation: 12938
Let's look at the below code.
List<String> names = Arrays.asList("Adam", "Brian", "Supun");
List<Integer> lengths = names.stream()
.map(name -> name.length())
.collect(Collectors.toList());
And simply then will look at the javadoc for streams.map
. There the signature for map
method appears like this.
<R> Stream<R> map(Function<? super T,? extends R> mapper)
Can somebody please explain how JVM maps the lambda expression we gave (name -> name.length()
) in terms of Function<? super T,? extends R> mapper
?
Upvotes: 10
Views: 4516
Reputation: 120848
A Function
is something that takes X
and returns Y
.
? super T == String
? extends R == Integer
basically with name -> name.length()
you are implementing the @FunctionlInterface Function<T,R>
with overriding the single abstract method R apply(T t)
.
You can also shorten that with a method reference :
Stream<Integer> lengths = names.stream().map(String::length);
Upvotes: 9
Reputation: 6946
Check apply
method from Function
:
R apply(T t);
? extends R
is return type, ? super T
is taken type
As Function
class has only one non-default public
method, it can map your lambda to Function
instance
Upvotes: 2