๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java

[Java] ์ŠคํŠธ๋ฆผ(Stream)

๋ฐ˜์‘ํ˜•

์ŠคํŠธ๋ฆผ์ด๋ž€?

-> ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค(์ปฌ๋ ‰์…˜, ๋ฐฐ์—ดโ€ฆ)๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฒƒ (JDK 1.8)
-> ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด์„ Stream์„ ํ†ตํ•ด์„œ ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ค‘๊ฐ„์—ฐ์‚ฐ(n๋ฒˆ)๊ณผ ์ตœ์ข…์—ฐ์‚ฐ(1๋ฒˆ)์„ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

  1. ์ŠคํŠธ๋ฆผ ๋งŒ๋“ค๊ธฐ
  2. ์ค‘๊ฐ„ ์—ฐ์‚ฐ (0~n๋ฒˆ)
  3. ์ตœ์ข… ์—ฐ์‚ฐ (1๋ฒˆ)
    ์ค‘๊ฐ„ ์—ฐ์‚ฐ - ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ธ ์—ฐ์‚ฐ. ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ์šฉ๊ฐ€๋Šฅ
    ์ตœ์ข… ์—ฐ์‚ฐ - ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹Œ ์—ฐ์‚ฐ. ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ ์šฉ๊ฐ€๋Šฅ (์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจ)= ์ค‘๋ณต์ œ๊ฑฐ -> 5๊ฐœ ์ž๋ฅด๊ธฐ -> ์ •๋ ฌ -> ์ถœ๋ ฅ
  4. stream.distinct().limit(5).sorted().forEach(System.out::println)

์ŠคํŠธ๋ฆผ์˜ ํŠน์ง•

1.์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋งŒํ•  ๋ฟ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
2.์ŠคํŠธ๋ฆผ์€ Iterator์ฒ˜๋Ÿผ ์ผํšŒ์šฉ์ด๋‹ค.(ํ•„์š”ํ•˜๋ฉด ๋‹ค์‹œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•จ)
3.์ตœ์ข… ์—ฐ์‚ฐ ์ „๊นŒ์ง€ ์ค‘๊ฐ„์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. - ์ง€์—ฐ๋œ ์—ฐ์‚ฐ
4.์ŠคํŠธ๋ฆผ์€ ์ž‘์—…์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
5.์ŠคํŠธ๋ฆผ์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ - ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ
6.๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ - IntStream, LongStream, DoubleStream
- ์˜คํ† ๋ฐ•์‹ฑ & ์–ธ๋ฐ•์‹ฑ์˜ ๋น„ํšจ์œจ์ด ์ œ๊ฑฐ๋จ(Stream ๋Œ€์‹  IntStream ์‚ฌ์šฉ)
- ์ˆซ์ž์™€ ๊ด€๋ จ๋œ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ Stream๋ณด๋‹ค ๋” ๋งŽ์ด ์ œ๊ณต

์ŠคํŠธ๋ฆผ ๋งŒ๋“ค๊ธฐ

๋‚œ์ˆ˜ ์ƒ์„ฑ

IntStream intStream = new Random().ints(); // ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ
intStream
    .limit(5) // 5๊ฐœ๋งŒ ์ž๋ฅด๊ธฐ
    .forEach(System.out::println);
-1718854561
-1607368184
-2129637815
35186230
-650554357

ํŠน์ • ๋ฒ”์œ„์˜ ์ •์ˆ˜

IntStream intStream = IntStream.range(1,5) // 1,2,3,4
IntStream intStream = IntStream.rangeClosed(1,5) // 1,2,3,4,5

๋žŒ๋‹ค์‹ ์ด์šฉ iterate(), generate()

Stream<Integer> evenStream = Stream.iterate(0, n -> n + 2) // 0, 2, 4, 6, ...

Stream<Double> randomStream = Stream.generate(Math::random); // ๋‚œ์ˆ˜ ๋ฌดํ•œ ์ƒ

์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ

์ค‘๊ฐ„ ์—ฐ์‚ฐ

  • distinct() : ์ค‘๋ณต์„ ์ œ๊ฑฐ
  • filter(์กฐ๊ฑด์‹) : ์กฐ๊ฑด์— ์•ˆ ๋งž๋Š” ์š”์†Œ ์ œ์™ธ
  • limit(long maxSize) : ์ผ๋ถ€๋ฅผ ์ž˜๋ผ๋‚ธ๋‹ค.
  • skip(long n) : ์ผ๋ถ€๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.
  • peek(Consumer comparator): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์— ์ž‘์—… ์ˆ˜ํ–‰
  • sorted() | sorted(Comparator comparator) : ์ •๋ ฌํ•œ๋‹ค.
  • map() : ์š”์†Œ๋“ค์„ ํŠน์ • ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜

์ตœ์ข… ์—ฐ์‚ฐ

  • forEach(action), forEachOrdered(action) : ์ง€์ •๋œ ์ž‘์—… ์ˆ˜ํ–‰
  • count() : ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
  • max, min : ์ตœ๋Œ€๊ฐ’ /์ตœ์†Œ๊ฐ’ ๋ฐ˜ํ™˜
  • findAny() : ์•„๋ฌด๊ฑฐ๋‚˜ ํ•˜๋‚˜ ๋ฐ˜ํ™˜
  • findFirst() : ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜
  • allMatch(์กฐ๊ฑด) : ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š”์ง€
  • anyMatch(์กฐ๊ฑด): ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋Š”์ง€
  • noneMatch(์กฐ๊ฑด): ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€
  • toArray(): ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • reduce() : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๊ณ„์‚ฐ
  • collect() : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘

์‚ฌ์šฉ ์˜ˆ์‹œ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€ ์˜ˆ์ •!

์ฐธ๊ณ  ์ž๋ฃŒ

์œ ํŠœ๋ธŒ ๋‚จ๊ถ์„ฑ์˜ ์ •์„์ฝ”๋”ฉ : https://www.youtube.com/channel/UC1IsspG2U_SYK8tZoRsyvfg

๋ฐ˜์‘ํ˜•

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์ž๋ฐ”๋ž€?  (0) 2022.05.01
[Java] ์ž๋ฐ” ์ปฌ๋ ‰์…˜ Map  (0) 2022.01.11
[Java] ์ž๋ฐ” ์ปฌ๋ ‰์…˜ Set  (0) 2022.01.11
[Java] String ํด๋ž˜์Šค ์ •๋ฆฌ  (0) 2022.01.08
[Java] ์ƒ์†์ด๋ž€?  (0) 2022.01.06