2017-10-16 5 views
8

아래 코드를 살펴 보겠습니다.lambda 표현식이 기능 인터페이스로 매핑되는 방식은 무엇입니까?

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

그리고 간단히 streams.map에 대한 javadoc 볼 것이다. 거기에 map 메서드의 서명이 이와 같이 나타납니다.

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

누군가는 JVM이 Function<? super T,? extends R> mapper의 측면에서 우리가 준 람다 식 ( name -> name.length())를 매핑하는 방법을 설명해 주시겠습니까?

+2

달성하려는 작업은 무엇입니까? Stream 유형의 로컬 변수를 생성 할 필요가 없습니다. 'names.stream(). map (...). collect (Collectors.toList())'를 찾고 계십니까? 또한 원시 목록 유형을 사용하지 마십시오. – Michael

+0

@Michael 실제로 나는 람다 표현 부분에 집중할 시청자가 필요했습니다. 그래서 당신이 언급 한 후자의 추가 사항을 추가하지 않았습니다. 이것은 람다를 기능적 인터페이스로 매핑하는 것을 이해하는 것입니다. 다른 건 없어. :)) –

+1

@ 마이클이 당신의 요점을 알아 냈습니다. 고맙습니다. :)) 희망 코드를 수정했습니다. –

답변

8

FunctionX을 취하고 Y을 반환하는 값입니다.

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

기본적으로 name -> name.length() 당신은 하나의 추상 메소드 R apply(T t)를 오버라이드 (override)으로 @FunctionlInterface Function<T,R>을 구현하고 있습니다.

당신은 또한 방법을 참조하여이 단축 될 수 있습니다 :

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

확인 Function에서 apply 방법 : 리턴 유형은

R apply(T t); 

? extends R입니다 ? super T이 수행되는 유형

Function 클래스로 기본값이 아닌 public 메서드를 하나만 사용하면 c 귀하의 람다를 Function 인스턴스에 매핑하십시오.