개발/java

map vs flatmap

캐리캐리 2022. 1. 4. 02:08

오늘은 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);
}

 

참조)http://daplus.net/java-java-8%EC%97%90%EC%84%9C-list-list%EB%A5%BC-list%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C/

 

[java] Java 8에서 List List를 List로 바꾸려면 어떻게해야합니까? - 리뷰나라

내가있는 경우 Java 8의 기능을 사용하여 동일한 반복 순서로 모든 객체를 포함 List<List<Object>>하는로 변환 할 수 List<Object>있습니까? 답변 당신이 사용할 수있는 flatMap하나의 스트림에 (스트림으로

daplus.net