Stream

์ŠคํŠธ๋ฆผ (Stream)

์ •์˜

  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค(์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด ๋“ฑ)๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฒƒ (Like Iterator)

  • ์ผ๋‹จ Stream์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ(์ผ๊ด„์ ์œผ๋กœ) ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋Šฅ (์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ)

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

    • ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ Stream์ธ ์—ฐ์‚ฐ

    • ์—ฌ๋Ÿฌ ๋ฒˆ ์ ์šฉ ๊ฐ€๋Šฅ

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

    • ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ Stream์ด ์•„๋‹Œ ์—ฐ์‚ฐ

      • void์ด๊ฑฐ๋‚˜, List๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ

    • โญ Stream์˜ ์š”์†Œ๋ฅผ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ

      • Like Iterator

ํŠน์ง•

  • ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ (read-only)

  • Stream ์ž์ฒด๋Š” ์ตœ์ข…์—ฐ์‚ฐ์— ์˜ํ•ด ๋ณ€๋™ ๊ฐ€๋Šฅ

    • Iterator์ฒ˜๋Ÿผ ๋™์ž‘

  • ์ตœ์ข… ์—ฐ์‚ฐ ์ „๊นŒ์ง€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋ฅผ ํ†ตํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ

    • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์› - ํฐ ์ž‘์—…(๋น…๋ฐ์ดํ„ฐ) ์ฒ˜๋ฆฌ์— ์šฉ์ด

    // ๋ชจ๋“  ๋ฌธ์ž์—ด ๊ธธ์ด ํ•ฉ
    int sum = strStream
    						.**parallel()**
    						.mapToInt(s -> s.length())
    						.sum();
  • ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜์—ฌ ์˜คํ† ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ ๋น„ํšจ์œจ ์ œ๊ฑฐ

    • Stream ๋Œ€์‹  IntStream

    • IntStream, LongStream, DoubleStream ๋“ฑ Primitive Type์— ๋Œ€ํ•œ Stream ์ง€์›

    • ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์€ ์ˆซ์ž์™€ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ผ๋ฐ˜ Stream๋ณด๋‹ค ๋” ๋งŽ์ด ์ œ๊ณต (sum, count, average ๋“ฑ)

์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

Collection

  • stream() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉ

    Stream<E> stream()

Array

  • of ๋ฉ”์†Œ๋“œ ์ด์šฉํ•˜๊ฑฐ๋‚˜ Arrays์˜ stream ๋ฉ”์†Œ๋“œ ์ด์šฉ

    // ๊ฐ€๋ณ€ ์ธ์ž
    Stream<T> Stream.of(T... values)
    
    // ๋ฐฐ์—ด
    Stream<T> Stream.of(T[] values)
    Stream<T> Arrays.stream(T[] values)
    
    // ์ผ๋ถ€ ์š”์†Œ๋งŒ ํฌํ•จ
    Stream<T> Arrays.stream(T[] values, int start, int end)
    
    // ๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ
    IntStream IntStream.of(int[] values)

๋‚œ์ˆ˜ ์ŠคํŠธ๋ฆผ

  • ๊ธฐ๋ณธํ˜• ์ž๋ฃŒํ˜•์˜ ๋ฌดํ•œ/์œ ํ•œ ๊ฐœ ๋‚œ์ˆ˜๋ฅผ ํฌํ•จ

  • Random ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉ

    // begin ~ end ์‚ฌ์ด์˜ ์ˆ˜๋ฅผ ๋ฌดํ•œ ๊ฐœ ํฌํ•จ
    IntStream ints(int begin, int end)
    DoubleStream doubles(double begin, double end)
    
    // ์š”์†Œ ์ˆ˜๋ฅผ ์œ ํ•œ ๊ฐœ๋กœ ์ œํ•œ
    IntStream ints(long streamSize, int begin, int end)
    DoubleStream doubles(long streamSize, double begin, double end)

์ •์ˆ˜ ์ŠคํŠธ๋ฆผ

  • ๊ธฐ๋ณธํ˜• ์ž๋ฃŒํ˜•์˜ ํŠน์ • ๋ฒ”์œ„ ์ •์ˆ˜๋ฅผ ํฌํ•จ

  • ๊ฐ ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์˜ range ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉ

    IntStream IntStream.range(int begin, int end)
    • ๋ฒ”์œ„๋Š” begin โ‰ค element < end

    • end๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด rangeClosed๋ฅผ ์‚ฌ์šฉ

๋žŒ๋‹ค์‹ ์ŠคํŠธ๋ฆผ

  • ๋žŒ๋‹ค์‹์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์š”์†Œ๋กœ ํฌํ•จ

  • ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ (limit์„ ํ†ตํ•ด ์ž˜๋ผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ)

  • iterate

    • ์ด์ „ ์š”์†Œ๋ฅผ seed๋กœ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐ

    static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
    
    // example [0, 2, 4, 6, ... n, n+2]
    Stream<Integer> evenStream = Stream.iterate(0, n->n+2);
    
  • generate

    • ์ฃผ์–ด์ง„ ๋žŒ๋‹ค์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์†Œ๋ฅผ ํฌํ•จ

    static <T> Stream<T> generate(Supplier<T> s)
    
    // example [1, 1, 1, ... 1, 1]
    Stream<Integer> oneStream = Stream.generate(()->1);

ํŒŒ์ผ ์ŠคํŠธ๋ฆผ

  • ํŒŒ์ผ์„ ์š”์†Œ๋กœ ํฌํ•จ

  • ํŒŒ์ผ ์ž์ฒด๋ฅผ ์š”์†Œ๋กœ ํฌํ•จ

    Stream<Path> Files.list(Path dir)
  • ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ผ์ธ ๋‹จ์œ„๋กœ ์š”์†Œ๋กœ ํฌํ•จ

    Stream<String> Files.lines(Path path)
    Stream<String> Files.lines(Path path, Charset cs)
    Stream<String> lines() // BufferedReader์˜ ๋ฉ”์†Œ๋“œ

Last updated