반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- vaultTemplate
- AOP target
- fotmatter
- gradle
- auto configuration
- RestTemplate
- java
- 쓰레드 안전
- 개방/폐쇄 원칙
- LogInterceptor
- 포맷터
- AOP 매개변수
- ResponseBodyAdvice
- Spring Boot
- AccessLevel
- Save Action
- spring
- findFirst
- Starter
- Stream
- restTemple
- JsonStringType
- AOP this
- AOP
- JsonType
- ClientHttpRequestInterceptor
- @AutoConfiguration
- jpa
- Thread Safety
- findAny
Archives
- Today
- Total
맨땅에 헤딩하는 개바른자
[Java] Stream > groupingBy 본문
반응형
git
https://github.com/ymwoo88/stream/tree/feature/groupingBy-%EC%98%88%EC%A0%9C
설명
Stream 안의 데이터에 classifier를 적용했을 때 결과값이 같은 값끼리 List로 모아서 Map의 형태로 반환해주는 Collector 입니다.
이때 키는 classifier의 결과값, value는 그 결과값을 같는 데이터들 입니다.
groupingBy
T 유형의 입력 요소에 대한 "그룹화 기준" 작업을 구현하고 분류 함수에 따라 요소를 그룹화하고 결과를 Map에 반환하는 Collector를 반환합니다.
분류 함수는 요소를 일부 키 유형 K에 매핑합니다. 수집기는 키가 분류 함수를 입력 요소에 적용한 결과 값이고 해당 값이 입력 요소를 포함하는 목록인 Map<K, List<T>>를 생성합니다. 분류 기능 아래의 관련 키에 매핑됩니다.
반환된 Map 또는 List 개체의 유형, 가변성, 직렬화 가능성 또는 스레드 안전성에 대한 보장은 없습니다.
Params: classifier – the classifier function mapping input elements to keys
Returns: a Collector implementing the group-by operation
Implementation Requirements:
This produces a result similar to: groupingBy(classifier, toList());
구현 참고 사항:
반환된 Collector는 동시적이지 않습니다. 병렬 스트림 파이프라인의 경우 결합기 기능은 한 맵의 키를 다른 맵으로 병합하여 작동하며 이는 비용이 많이 드는 작업일 수 있습니다. 결과 맵 수집기에 요소가 표시되는 순서를 보존할 필요가 없는 경우 groupingByConcurrent(Function)를 사용하면 더 나은 병렬 성능을 제공할 수 있습니다.
See Also:
groupingBy(함수, 수집기),
groupingBy(함수, 공급업체, 수집기),
groupingByConcurrent(함수)
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
return groupingBy(classifier, toList());
}
예제
- 샘플 데이터
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private Long id;
private String name;
private String email;
private Integer age;
private Boolean isWorking;
private List<String> hobbies;
public static User getUserAmil() {
return User.builder()
.id(1L)
.name("amil")
.email("amil@ymwoo.com")
.age(28)
.isWorking(true)
.hobbies(List.of("골프", "영화감상"))
.build();
}
public static User getUserBenny() {
return User.builder()
.id(2L)
.name("benny")
.email("benny@ymwoo.com")
.age(26)
.isWorking(true)
.hobbies(List.of("골프", "낚시"))
.build();
}
public static User getUserCho() {
return User.builder()
.id(3L)
.name("cho")
.email("cho@ymwoo.com")
.age(33)
.isWorking(false)
.hobbies(List.of("등산", "캥핌"))
.build();
}
public static List<User> getExamUserList() {
return Arrays.asList(getUserAmil(), getUserCho(), getUserBenny());
}
@Override
public boolean equals(Object o) {
if (o instanceof User) {
return this.isWorking.equals(((User) o).getIsWorking()); // 값 비교
}
return false;
}
@Override
public int hashCode() {
return isWorking.hashCode();
}
}
- 예졔1) 연산용 그룹핑 케이스
@Test
@DisplayName("연산용 그룹핑 케이스")
void case1() {
List<Integer> numbers = Arrays.asList(13, 2, 101, 203, 304, 402, 305, 349, 2312, 203);
Map<Integer, List<Integer>> unitDigitMap = numbers.stream()
// 10으로 나눈 나머지가 같은 것들끼리 List로 만들고, 키는 나머지값, value는 나머지 값이 일치하는 데이터로 만든 리스트
.collect(Collectors.groupingBy(number -> number % 10));
log.info("result = {}", unitDigitMap);
Map<Integer, Set<Integer>> unitDigitSet = numbers.stream()
// value값을 리스트가 아닌 Set 컬렉션으로 만들기
.collect(Collectors.groupingBy(number -> number % 10, Collectors.toSet()));
log.info("result = {}", unitDigitSet);
Map<Integer, List<String>> unitDigitStrMap = numbers.stream()
.collect(Collectors.groupingBy(number -> number % 10,
// value값을 데이터 그대로 넣지 않고 mapping으로 가공한 뒤 해당 데이터를 리스트로 만들어 value로 저장
Collectors.mapping(number -> "unit digit is " + number, Collectors.toList())));
log.info("result = {}", unitDigitStrMap.get(3));
}
19:51:57.488 [Test worker] INFO com.ymwoo.stream.collector.groupingby.StreamGroupingByTest -- result = {1=[101], 2=[2, 402, 2312], 3=[13, 203, 203], 4=[304], 5=[305], 9=[349]}
19:51:57.492 [Test worker] INFO com.ymwoo.stream.collector.groupingby.StreamGroupingByTest -- result = {1=[101], 2=[2, 402, 2312], 3=[203, 13], 4=[304], 5=[305], 9=[349]}
19:51:57.492 [Test worker] INFO com.ymwoo.stream.collector.groupingby.StreamGroupingByTest -- result = [unit digit is 13, unit digit is 203, unit digit is 203]
- 예제2) 객체 그룹핑 케이스
@Test
@DisplayName("객체 그룹핑 케이스")
void case2() {
List<User> examUserList = User.getExamUserList();
Map<Boolean, List<User>> isWorkGroup = examUserList.stream()
.collect(Collectors.groupingBy(User::getIsWorking));
// isWorking 이 true, false 키 기준으로 사용자가 그룹핑 결과가 되어있다.
isWorkGroup.keySet()
.forEach(key -> log.info("key = [{}], value = {}" , key, isWorkGroup.get(key)));
}
19:53:03.417 [Test worker] INFO com.ymwoo.stream.collector.groupingby.StreamGroupingByTest -- key = [false], value = [User(id=3, name=cho, email=cho@ymwoo.com, age=33, isWorking=false, hobbies=[등산, 캥핌])]
19:53:03.425 [Test worker] INFO com.ymwoo.stream.collector.groupingby.StreamGroupingByTest -- key = [true], value = [User(id=1, name=amil, email=amil@ymwoo.com, age=28, isWorking=true, hobbies=[골프, 영화감상]), User(id=2, name=benny, email=benny@ymwoo.com, age=26, isWorking=true, hobbies=[골프, 낚시])]
참조
반응형
'JAVA > Stream' 카테고리의 다른 글
[Java] Stream > findAny, findFirst (0) | 2023.07.04 |
---|---|
[Java] Stream > toMap (0) | 2023.06.20 |
[Java] Stream > reduce (0) | 2023.06.20 |
[Java] Stream > foreach (0) | 2023.06.20 |
[Java] Stream > distinct (0) | 2023.06.08 |