Language/Java

[JAVA] Stream - Collector(์ฝœ๋ ‰ํ„ฐ), Stream์„ List,Set์œผ๋กœ ๋ฐ˜ํ™˜

LightSource 2022. 7. 1. 09:15

java8 Stream - Collector(์ฝœ๋ ‰ํ„ฐ)

  • Stream์„ ์ผ๋ฐ˜์ ์ธ List, Set๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” Stream์˜ ์ตœ์ข…์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

1. Stream.collect()

  • ๋ฐ์ดํ„ฐ์˜ ์ค‘๊ฐ„์ฒ˜๋ฆฌํ›„, ๋งˆ์ง€๋ง‰์— List,Set ๋“ฑ์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ํ•„์š”ํ•œ ์š”์†Œ๋งŒ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ์š”์†Œ๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•œ ํ›„, ์ง‘๊ณ„(Reduction)ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Stream.collect() ์˜ ์‚ฌ์šฉ

  • collect(Collector<T,A,R> collector)
  • T : ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’, Stream์˜ ์š”์†Œ
  • A : ๋ˆ„์ ๊ธฐ, ๋ˆ„์ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•  ํ•จ์ˆ˜
  • R : ๋ฆฌํ„ด๊ฐ’, ๋ˆ„์ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฐ์ฒด

3. Collector์˜ ๋ฉ”์„œ๋“œ

toList, toSet

  • Stream์˜ ๋ชจ๋“  elements๋“ค์„ List๋‚˜ Set ์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
List<String> result = clist.stream().collect(Collectors.toList());
System.out.println("result = " + result); //result = [a, b, c, abc, abc]
List<String> clist = Arrays.asList("a", "b", "c", "abc");
Set<String> result = clist.stream().collect(Collectors.toSet());
System.out.println("result = " + result); //result = [a, b, c, abc]
  • ์‘์šฉ
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
List<String> result = clist.stream()
        .filter(list -> list.startsWith("a"))
        .collect(Collectors.toList());
System.out.println("result = " + result); //result = [a, abc, abc]

→ Stream์˜ filter()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ a๋กœ ์‹œ์ž‘ํ•˜๋Š” elements๋“ค๋งŒ ์„ ๋ณ„ํ•˜์—ฌ Listํ˜•ํƒœ๋กœ ์ถœ๋ ฅ

toCollection(Supplier<Collection>)

  • ์ผ๋ฐ˜์ ์ธ List,Setํ˜•ํƒœ๋ณด๋‹ค ๋” ํŠน์ •ํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
  • ์•„๋ž˜๋Š” Listํ˜•ํƒœ๋ฅผ ArrayListํ˜•ํƒœ๋กœ ์ƒ์„ฑํ•œ ๋ชจ์Šต
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
ArrayList<String> collect = clist.stream().collect(Collectors.toCollection(ArrayList::new));
System.out.println("collect = " + collect); //collect = [a, b, c, abc, abc]

toMap

  • Stream์˜ elements๋“ค์„ Map ํ˜•ํƒœ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ
  • keyMapper, ValueMapper๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌ
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
Map<String, Integer> collect = clist.stream().collect(Collectors.toMap(p -> p, String::length, (old, newInteger) -> old));
System.out.println("collect = " + collect); //collect = {a=1, b=1, abc=3, c=1}

→ toMap์„ ํ†ตํ•ด์„œ key๋Š” clist์˜ key๋กœ ์‚ฌ์šฉํ•˜๊ณ , value๋Š” key.length๋กœ ์‚ฌ์šฉ
→ key๊ฐ’์—์„œ “abc”๊ฐ€ 2๊ฐœ๋กœ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ๊ฒจ์šฐ, ๊ธฐ์กด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ๋ช…์‹œ

Joining

  • Stream์„ Stringํ˜•์œผ๋กœ ํ•ฉ ํ•ด์ค€๋‹ค.
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
String collect = clist.stream().collect(Collectors.joining());
System.out.println("collect = " + collect); //collect = abcabcabc

grouping

  • ์›ํ•˜๋Š” ์กฐ๊ฑด๋Œ€๋กœ Stream์˜ elements๋ฅผ Groupingํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
Map<Integer, List<String>> collect = clist.stream().collect(Collectors.groupingBy(String::length, Collectors.toList()));
System.out.println("collect = " + collect); //collect = {1=[a, b, c], 3=[abc, abc]}

→ String.length์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ grouping

counting

  • Stream์˜ elements์˜ ์ˆ˜๋ฅผ ์„ธ์„œ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
List<String> clist = Arrays.asList("a", "b", "c", "abc", "abc");
Long collect = clist.stream().collect(Collectors.counting());
System.out.println("collect = " + collect); //collect = 5
๋ฐ˜์‘ํ˜•