TIL, WIL/TIL๐Ÿ“˜

02. 26 TIL : Collectors.groupingBy() ์™ธ ~ List<Object> list๋ฅผ ํŠน์ • ์š”์†Œ๋กœ mapping

wannaDevelopIt 2025. 2. 26. 17:06
728x90

list<Obejct> list ์•ˆ์˜ ์š”์†Œ๋ฅผ ๋ถ„๋ฅ˜ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ stearm().fileter() ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์œผ๋ก  ํ•„ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐœ๋ผ๋‚ด๋Š” ๊ฒƒ๋ฐ–์— ํ•  ์ˆ˜ ์—†๋‹ค.

 

ํŠน์ • ์š”์†Œ์˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ,

strream().collect(Collectors.groupingBy(Object:getField));

 

๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

 

์ด ๋ฐฉ์‹์„ ํ†ตํ•ด ํ•˜๋‚˜์˜ Field๋กœ ๋ถ„๋ฅ˜๋œ Map<String, List<Object>> ํƒ€์ž…์ธ map์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด์ œ ๋ฆฌ์ŠคํŠธ ๋ณ„๋กœ ๋ถ„๋ฅ˜๋œ ์ธ์Šคํ„ด์Šค์—

 

์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, GPT๊ฐ€ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”,

 

1) ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋ถ„๋ฅ˜ 

Map<String, Set<Obejct>> groupedSetMap = stream()
    .collect(Collectors.groupingBy(
        Object::getField,
        Collectors.toSet()
));

 

2) ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ Thread-Safeํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ธฐ : ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋น ๋ฅด๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ธฐ(๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์œ ์šฉ)

ConcurrentMap<String, List<Object>> groupedConcurrent = 
	stream().collect(Collectors.groupingByConcurrent(Object::getField));

 

3) ๋‹ค์ค‘ ๋ถ„๋ฅ˜(์ด๋ฏธ ๋ถ„๋ฅ˜๋œ ๊ทธ๋ฃน์— ๋‹ค๋ฅธ ๋ถ„๋ฅ˜ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ)

Map<String, Map<String, List<Object>>> multiLevelGrouped = stream()
    .collect(Collectors.groupingBy(
        Object::getField1,
        Collectors.groupingBy(Object::getField2)
));

~ ์ด ๋ฐฉ๋ฒ•๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋“ฏ ํ•˜๋‹ค. ํ•œ๋ฒˆ ๋ถ„๋ฅ˜ํ•œ ๊ทธ๋ฃน์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

 

4) Guava

ImmutableListMultimap<String, Object> multimap = Multimaps.index(list, Object::getField);

 

5) stream์„ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ณต๋ฌธ

Map<String, List<Object>> grouped = new HashMap<>();
for (Object vo : list) {
    grouped.computeIfAbsent(vo.getField(), k -> new ArrayList<>()).add(vo);
}


์ด๋Ÿฐ ๋ฐฉ์‹์„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

728x90