Stream

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋„๋ก ์†Œ์Šค์—์„œ ์ถ”์ถœ๋œ ์—ฐ์†๋œ ์š”์†Œ

  • ์ŠคํŠธ๋ฆผ์€ ํŠน์ • ์š”์†Œ ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ์†๋œ ๊ฐ’ ์ง‘ํ•ฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค(filter, sorted, map ๊ฐ™์€ ํ‘œํ˜„ ๊ณ„์‚ฐ์‹) โ†” ์ปฌ๋ ‰์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•จ

  • ์ŠคํŠธ๋ฆผ์€ ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด, I/O ์ž์› ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ œ๊ณต ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค. ์ž…๋ ฅ ๊ทธ๋Œ€๋กœ ๊ฐ™์€ ์ถœ๋ ฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค

  • ์ŠคํŠธ๋ฆผ์€ fp์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•˜๊ฒŒ filter, map, reduce, find, match, sort ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅด๋ฅด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ์ˆœ์ฐจ์  ๋˜๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

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

  • ํŒŒ์ดํ”„๋ผ์ด๋‹ - ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•ด์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ŠคํŠธ๋ฆผ ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค - laziness, short-circuiting ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง

    • ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ฐ›์•„์„œ ์ŠคํŠธ๋ฆผ์„ ๊ตฌ์„ฑํ•˜๊ณ , filter, map, limit,๋กœ ์ด์–ด์ง€๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๊ณ , collect๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. collect๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ฌด ์—ฐ์‚ฐ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์ €์žฅ๋จ. ์ง€์—ฐ์—ฐ์‚ฐ)

    • collect๋Š” ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค(toList()๋กœ ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜)

  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต - ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์ง€์›ํ•จ โ†” ์ปฌ๋ ‰์…˜์€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ๊ณผ ์ปฌ๋ ‰์…˜์˜ ์ฐจ์ด, ๋ฐฐ๊ฒฝ

  • ๊ณตํ†ต์  - ์ž๋ฐ” ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ์€ ์—ฐ์†๋œ ์š”์†Œ ํ˜•์‹์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค

  • ์ฐจ์ด์ 

    1. ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ๊ณ„์‚ฐํ•˜๋Š” ์ง€์˜ ์—ฌ๋ถ€

      • ์ปฌ๋ ‰์…˜์€ ํ˜„์žฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค(์ ๊ทน์  ์ƒ์„ฑ - ๋ชจ๋“  ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. DVD์— ์ €์žฅ๋œ ์˜ํ™”)

      • ์ŠคํŠธ๋ฆผ์€ ์š”์ฒญํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณ ์ •๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค(๊ฒŒ์œผ๋ฅธ ์ƒ์„ฑ - ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท ์—ฐ์‚ฐ)

        • ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š” ์š”์ฒญํ•  ๋•Œ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋œ๋‹ค

    2. ํ•œ๋ฒˆ ์†Œ๋น„๋œ ์ŠคํŠธ๋ฆผ์€ ๋‹ค์‹œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์—†์Œ

      • ์ŠคํŠธ๋ฆผ์€ ํ•œ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ ํƒ์ƒ‰ํ•œ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค(๋‹จ ํ•œ๋ฒˆ๋งŒ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค)

        Stream<String> s = menu.stream();
        s.forEach(System.out::println);
        s.forEach(System.out::println); // java.lang.IllegalStateException์ด ๋ฐœ์ƒํ•จ. ์ŠคํŠธ๋ฆผ์ด ์ด๋ฏธ ์†Œ๋น„๋˜์—ˆ๊ฑฐ๋‚˜ ๋‹ซํž˜
      • ์ŠคํŠธ๋ฆผ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€

        A stream should be operated on (invoking an intermediate or terminal stream operation) only once.

        A stream implementation may throw IllegalStateException if it detects that the stream is being reused.

        • ์žฌํ• ๋‹น์„ ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Supplier๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. ์™ธ๋ถ€ ๋ฐ˜๋ณต, ๋‚ด๋ถ€ ๋ฐ˜๋ณต

      • ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆœํšŒํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ๋œ๋‹ค. (iterator๋‚˜ foreach๋ฌธ์œผ๋กœ ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ˆœํšŒํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆจ๊ฒจ์ง„ iterator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์™ธ๋ถ€ ๋ฐ˜๋ณต)

      • ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” filter, map, sorted ๋“ฑ์˜ ์—ฐ์‚ฐ์œผ๋กœ ๋ฐ˜๋ณต์„ ์ถ”์ƒํ™”ํ•ด์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ ์ŠคํŠธ๋ฆผ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๋Š” ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•œ๋‹ค(iterator๊ฐ€ ํ•„์š”์—†์Œ)

        List<String> names = new ArrayList<>();
        for(Dish dish: menu) {
        	names.add(dish.getName());
        }
        List<String> names = menu.stream()
        	.map(Dish::getName)
        	.collect(toList());
      • ์ŠคํŠธ๋ฆผ์˜ ๋‚ด๋ถ€๋ฐ˜๋ณต์ด ์ปฌ๋ ‰์…˜์˜ ์™ธ๋ถ€๋ฐ˜๋ณต๋ณด๋‹ค ๋” ์ข‹์€ 2๊ฐ€์ง€ ์ด์œ 

        1. filter๋‚˜ map ๋“ฑ์˜ ์ค‘๊ฐ„์—ฐ์‚ฐ์ด ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ถ€๋ฐ˜๋ณต์„ ์ด์šฉํ•˜๋ฉด ์ž‘์—…์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ์ตœ์ ํ™”๋œ ๋‹ค์–‘ํ•œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

        2. ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ ๋ฐ์ดํ„ฐ ํ‘œํ˜„๊ณผ ๋ณ‘๋ ฌ์„ฑ ๊ตฌํ˜„์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜์ง€๋งŒ ์™ธ๋ถ€๋ฐ˜๋ณต์˜ ๊ฒฝ์šฐ ๋ณ‘๋ ฌ์„ฑ์„ synchronized ๋“ฑ์œผ๋กœ ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค(์ŠคํŠธ๋ฆผ API ๋‚ด๋ถ€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ• ์ง€ ๋ง์ง€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค)

Last updated