JAVA/Java Stream

Map Parallel (Map 병렬처리) 방법

lovineff 2021. 3. 30. 15:16

Map은 Thread Safe 하지 않기 때문에 병렬처리가 되지 않는다.

이를 해결하기 위해 Map.entrySet을 호출하여 처리한다.

 

 

병렬 Stream으로 선언했으나 forEach 구문 내에서는 단일 쓰레드로 처리된다. (Map 때문)

historyList.parallelStream()
  .collect(Collectors.groupingBy(History::getBbsId))  // 조회환 history 데이터를 bbsId 별로 그룹핑
  .forEach((key, value) -> {
    // Article 테이블 데이터 inQuery 조회
    // ArticleId만 추출
    List<Long> articleIdList = value.stream().map(History::getArticleId).collect(Collectors.toList());
    giantArticleList.addAll(articleService.newGetArticle(new ArticleCommandByList(key, articleIdList)));
});

 

Map.entrySet()으로 병렬 처리를 수행

historyList.stream()
  .collect(Collectors.groupingBy(History::getBbsId))
  .entrySet()
  .parallelStream()
  .forEach(entry ->{
    List<Long> articleIdList = entry.getValue().stream().map(History::getArticleId).collect(Collectors.toList());
    giantArticleList.addAll(articleService.newGetArticle(new ArticleCommandByList(entry.getKey(), articleIdList)));
});

 

 

추가 내용)

Map을 for문을 통해 처리하는것 보다 Map.entrySet()을 호출하여 처리하는것이 효율적이다.

Map.entrySet()은 map.get('key')로 객체를 재탐색하는 시간을 줄일수 있기 때문임.

'JAVA > Java Stream' 카테고리의 다른 글

Map 반복문  (0) 2021.04.12
Stream 객체 값 변경 예제  (0) 2020.11.30
Java 1.8 CompletableFuture 모든 동작 완료 확인  (0) 2020.06.04
Stream 함수  (0) 2020.06.04
JAVA Stream 기본  (0) 2020.06.04