본문 바로가기
백엔드/Java

Collectors.groupingBy 널(null) 키 사용하기

by 1005ptr 2021. 3. 8.
반응형

Map<Key, Value> 키와 밸류가 한 쌍이 되어 저장되는 자료구조

 

DB 설계가 세가지 데이터를 한방에 관리해서 각자 다른 PK를 가지는 테이블을 그룹핑해서 써야되는 일이 생겼다.

세종류의 PK가 있는데 하나의 데이터는 셋중에 하나의 값만 가지고 나머지는 null 값이 들어있다.

그룹핑을 쓰려니 아! SQL에서 그룹바이하면 null은 무시되는데? 라는 생각이 들어 찾아보니

역시나 는 아니고 SQL때문이 아니라 Map의 Key에는 널이 들어가면 안되기 때문에 에러가 난다고 한다.

 

좋은 방법은 아니지만 개발은 해야되니까 방법을 찾아야 한다.

해결 방법은 Optional을 쓰는 것이다.

 

Optional을 키로 가지는 Map을 외부에서 접근하도록 유지하고 이러면 큰일난다.

내 경우에는 중간단계에서 Optional로 작업하고 반환할때는 SUM 처리해서 List로 반환해서 부작용은 없는 코드다.

(중간단계에서 사용되고 버려지는 변수)

Map<Tuple<Optional<String>>, List<T>> mapLatest = latest.stream()
				.collect(Collectors.groupingBy(item->
					new Tuple<Optional<String>>(
							Optional.ofNullable(item.getA()),
							Optional.ofNullable(item.getB()),
							Optional.ofNullable(item.getC()),
							Optional.ofNullable(item.getD()),
							Optional.ofNullable(item.getE()),
							Optional.ofNullable(item.getF()),
							Optional.ofNullable(item.getG()),
							Optional.ofNullable(item.getH()),
							Optional.ofNullable(item.getI())
							)));

 

stackoverflow.com/questions/22625065/collectors-groupingby-doesnt-accept-null-keys

 

Collectors.groupingBy doesn't accept null keys

In Java 8, this works: Stream stream = Stream.of(ArrayList.class); HashMap<class, list<class="">> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass)); ...</class,>

stackoverflow.com

 

반응형

'백엔드 > Java' 카테고리의 다른 글

스트림 Stream  (0) 2021.05.18
StringUtils.hasText 메서드 : C#의 String.IsNullorEmpty 메서드 대응  (0) 2021.03.28
Optional  (0) 2021.03.07
함수형 인터페이스  (0) 2021.03.07
멀티스레드 처리  (0) 2020.12.07

댓글