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 |