02. 26 TIL : Collectors.groupingBy() ์ธ ~ List<Object> list๋ฅผ ํน์ ์์๋ก mapping
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);
}
์ด๋ฐ ๋ฐฉ์์ ํ์ฉ ๊ฐ๋ฅํ๋ค