1. ์š”์†Œ ์ˆ˜์ง‘

Stream๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋ž˜์Šค ์—์„œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ฉ”์„œ๋“œ์ธ ๋ฉ”์„œ๋“œ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค collect(). ์ŠคํŠธ๋ฆผ์—์„œ ์นœ์ˆ™ํ•œ ์ปฌ๋ ‰์…˜( List<T>, ๋“ฑ) ์œผ๋กœ ์ด๋™ํ•˜๋Š” Set<T>๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.Map<T, R>

์ด collect()๋ฉ”์„œ๋“œ๋Š” ํŠน์ˆ˜ collector๊ฐœ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐœ์ฒด๋Š” ์ŠคํŠธ๋ฆผ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ํŠน์ • ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆ˜์ง‘ ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ์ด ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์ž‘์—…์€ ๋‹ค์†Œ ๋งค๋„๋Ÿฌ์šด ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. collector๊ฐ์ฒด์˜ ์œ ํ˜•์€ ์ž…๋‹ˆ๋‹ค Collector<T, A, R>. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์„ธ ๊ฐ€์ง€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜( R)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์™€ ๊ฐ™์€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค List<T>. ์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์ž์ฒด์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค collect().

๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์œผ์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  Collector ๊ฐœ์ฒด๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์˜ ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ์„ฑํ’ˆ์ด๋ฉด Collectors์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ง‘๊ฐ€ ํด๋ž˜์Šค

์ด Collectorsํด๋ž˜์Šค์—๋Š” ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ˆ˜์ง‘๊ธฐ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ๋“ค์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

toList()
์ŠคํŠธ๋ฆผ์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ์ฒด( List<T>)
toSet()
์ŠคํŠธ๋ฆผ์„ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ์ฒด( Set<T>)
toMap()
Map<K, V>์ŠคํŠธ๋ฆผ์„ ๋งต( ) ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ์ฒด
joining()
์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ์—ฐ๊ฒฐ
mapping()
๋ฌธ์ž์—ด์˜ ์š”์†Œ๋ฅผMap<K, V>
groupingBy()
์š”์†Œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ๋ฐ˜ํ™˜Map<K, V>

2. ์ŠคํŠธ๋ฆผ์„ ๋ชฉ๋ก์œผ๋กœ ๋ณ€ํ™˜

๋‹ค์Œ์€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ชฉ๋ก์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

List<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toList() );

์ปฌ๋ ‰์…˜์—์„œ ์ŠคํŠธ๋ฆผ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฒซ ๋ฌธ์ž๊ฐ€ ๋Œ€๋ฌธ์ž์ธ ๋ฌธ์ž์—ด๋งŒ ์œ ์ง€ํ•˜์—ฌ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ˆ˜์ง‘๋œ ๋‹ค์Œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.



3. ์ŠคํŠธ๋ฆผ์„ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜

๋‹ค์Œ์€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Set<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toSet() );

๋ชจ๋“  ๊ฒƒ์€ ์ŠคํŠธ๋ฆผ์„ ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฝ”๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ List์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ์ˆ˜์ง‘๊ธฐ ๊ฐœ์ฒด๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค toSet().



4. ์ŠคํŠธ๋ฆผ์„ ๋งต์œผ๋กœ ๋ณ€ํ™˜

๊ทธ๋Ÿฌ๋‚˜ ์ŠคํŠธ๋ฆผ์„ ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Map์˜ ๊ฐ ํ•ญ๋ชฉ์€ ํ‚ค์™€ ๊ฐ’์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ํ‚ค์™€ ๊ฐ’์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");

Map<String, String> result = list.stream()
   .map( e -> e.split("=") )
   .filter( e -> e.length == 2 )
   .collect( Collectors.toMap(e -> e[0], e -> e[1]) );

์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

map(...)์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ ๊ฐ ๋ฌธ์ž์—ด์„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค . split ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” filter()์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด๋งŒ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด d==3์€ ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์„ธ ๊ฐ€์ง€ ์š”์†Œ์˜ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ์ŠคํŠธ๋ฆผ์„ Map<String, String>. ๋ฉ”์„œ๋“œ ์— ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค toMap(). ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

๊ฐ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ("a", "b", "c")๋Š” ํ‚ค๊ฐ€ ๋˜๊ณ  ๊ฐ ๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ์š”์†Œ("2", "3", "4")๋Š” ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.



5. ์ŠคํŠธ๋ฆผ์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ปฌ๋ ‰ํ„ฐ ๊ฐ์ฒด๋Š” ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค Collectors.joining(). ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ Stringโ€‹โ€‹๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );