Collection.stream().map()로부터의 거절을 거쳐

6147 단어 java8자바

구현하고 싶은 일



List 요소의 클래스에서 두 개의 String를 추출하고,
그 2 개의 String를 포함한 Pair의 List를 생성한다.



스트림 사용하면 좋을 것 같아요^^

빌드할 수 없음


List<Hogehoge> list;

list
.stream()
.map(Pair.of(Hogehoge::getFoo, Hogehoge::getBar)) 
// ↑↑ Object is not a functional interface ↑↑
.collect(Collectors.toList())

응! ?

Functional Interface!?



함수형 인터페이스는
함수 메소드라는 단일 추상 메소드를 포함하는 인터페이스
ref . 패키지 java.util.function
ref . Java8 in Action

게다가...

람다 식을 사용하여,
함수형 인터페이스의 추상 메소드의 구현을 인라인으로 명시할 수 있고,
전체 표현식은 함수 인터페이스의 인스턴스로 취급 될 수 있습니다.
(말하자면, 함수형 인터페이스의 구현이 된다)
ref . Java8 in Action

과연.
여기서, 이하의 2개의 것을 이해.
1. 함수형 인터페이스는 단일 추상 메소드를 포함하는 인터페이스
2. 람다 식으로 함수형 인터페이스 구현 가능

원래 Stream.map()의 정의는 ^^;



Stream map(Function mapper)
파라미터: mapper
- 각 요소에 적용되는 비 간섭, 상태 비 저장 기능
인터페이스 Stream<T>

인수 mapper의 형태인 Function은,
단일 추상 메서드apply가 있는 "함수 인터페이스"
ref. 인터페이스 기능 <T, R>

주제로 돌아가



함수형 인터페이스인 Function을 람다 식으로 구현해,
map에 건네주면 좋은 것을 알았다.
List<Hogehoge> list;
Function<Hogehoge,Pair<String,String>> makePairsFromObj = 
hoge -> Pair.of(hoge.getFoo(), hoge.getBar());

List<Pair<String, String>> pList = list
                .stream()
                //.map(makePairFromObj::apply) 
                .map(makePairFromObj) // Function型の変数を渡せばよい by @swordone 
                .collect(Collectors.toList());

혹은, 직접 람다식을 건네준다 ( @swordone 씨로부터의 지적)
List<Hogehoge> list;

List<Pair<String, String>> pList = list
                .stream()
                .map(hoge -> Pair.of(hoge.getFoo(), hoge.getBar()))
                .collect(Collectors.toList());

\(^o^)/

좋은 웹페이지 즐겨찾기