ABOUT ME

프로그램을 공부하는 내용과 일상적인 내용을 공유하는 곳입니다.

Today
Yesterday
Total
  • map vs flatmap
    개발/java 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

     

    '개발 > java' 카테고리의 다른 글

    Exception 분리  (3) 2024.08.19
    RESTAPI 이력감지  (0) 2024.08.19
    익명클래스 실용편  (1) 2022.01.01
    익명클래스  (1) 2022.01.01
    stream vs parallelStream  (0) 2021.12.30

    댓글

Designed by Tistory.