Supun Wijerathne
Supun Wijerathne

Reputation: 12938

How a lambda expression maps into a functional interface?

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

Answers (2)

Eugene
Eugene

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

ByeBye
ByeBye

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

Related Questions