map vs flatmap
오늘은 stream 연산자 중 둘의 차이점에 대해 살펴보겠습니다.
리스트 내 개별 항목들을 특정 형식으로 변경하려고 할때 map을 주로 사용합니다.
그러나 이 맵이 이중으로 쌓여져 있다면 ??? distinct 처리를 해야한다면 ?? map을 통해서 할수가 없습니다.
좀 더 예시를 들어보겠습니다.
가정 : 주문을 할때 배송지휴대폰 번호를 주문자 번호가 아닌 부모님 번호로 주문을 했고 부모님과 주문자 모두가 해당 사이트에
가입이 되어있다고 가정해보겠습니다.
이력조회 프로그램 설명
1.배송지이력 내 휴대폰번호를 넣어 고객번호 리스트를 추출합니다.
2.추출된 고객번호 리스트에 있는 고객번호 들을 고객 정보 조회 메서드에 전달하여 고객정보리스트를 가져옵니다.
문제점 : 고객정보조회 메서드에서 정보리스트를 가져 올때 한 고객 당 여러 아이디를 가질수 있기 때문에 리스트로 받아옵니다.
1)List<member> my = 주문자에 대한 회원리스트
2)List<member> parent= 부모님에 대한 회원리스트
회원정보 노출을 위해 아래와 같이 두 리스트를 하나로 통일하는 작업을 해야합니다.
List<member> memberList = new ArrayList<>();
memberList.addAll(my);
memberList.addAll(parent);
이제 이를 구현을 해보겠습니다.
기존 코드
List<String> 고객번호리스트 =배송지이력(휴대폰번호);
List<member> 멤버리스트 = new ArrayList<>();
for(String s : 고객번호리스트){
멤버리스트.addAll(memberApi(고객번호));
}
변경 코드
List<member> 멤버리스트 =배송지이력(휴대폰번호).stream().map(고객번호->{
memberApi(고객번호)
}).flatMap(Collection::stream).collect(Collectors.toList());
훨씬 깔끔한 모습을 볼 수 있습니다.
설명이 좀 장황했는데 map에서는 개별 stream의 각 요소에 접근을 할 수 없지만 flatmap은 개별 stream에 접근이 가능합니다.
그러므로 List<List<member>>형식이 아닌 List<member> 형식으로 사용할 수 있습니다.
아래는 해당 예시를 flatmap 포함하여 여러 가지 방법으로 사용할 수 있는 예제 입니다.
private <T> List<T> mergeOne(Stream<List<T>> listStream) {
return listStream.flatMap(List::stream).collect(toList());
}
private <T> List<T> mergeTwo(Stream<List<T>> listStream) {
List<T> result = new ArrayList<>();
listStream.forEach(result::addAll);
return result;
}
private <T> List<T> mergeThree(Stream<List<T>> listStream) {
return listStream.reduce(new ArrayList<>(), (l1, l2) -> {
l1.addAll(l2);
return l1;
});
}
private <T> List<T> mergeFour(Stream<List<T>> listStream) {
return listStream.reduce((l1, l2) -> {
List<T> l = new ArrayList<>(l1);
l.addAll(l2);
return l;
}).orElse(new ArrayList<>());
}
private <T> List<T> mergeFive(Stream<List<T>> listStream) {
return listStream.collect(ArrayList::new, List::addAll, List::addAll);
}
[java] Java 8에서 List List를 List로 바꾸려면 어떻게해야합니까? - 리뷰나라
내가있는 경우 Java 8의 기능을 사용하여 동일한 반복 순서로 모든 객체를 포함 List<List<Object>>하는로 변환 할 수 List<Object>있습니까? 답변 당신이 사용할 수있는 flatMap하나의 스트림에 (스트림으로
daplus.net