[Java] Stream

Ahnickยท2021๋…„ 2์›” 26์ผ
0
post-thumbnail
post-custom-banner

๋ณธ ํฌ์ŠคํŒ…์€ '๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜'์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Stream

์ŠคํŠธ๋ฆผ์€ Java8 ์—์„œ ๋žŒ๋‹ค์™€ ๊ฐ™์ด ๋“ฑ์žฅํ•œ Java API์ž…๋‹ˆ๋‹ค.
์ŠคํŠธ๋ฆผ์€ ์ž๋ฐ”์— ์กด์žฌํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด ๋“ฑ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ
๋ฐ˜๋ณต์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” API
์ž…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ์€ ๋žŒ๋‹ค ํ‘œํ˜„์‹๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ•์ ์„ ๋ฐœํœ˜ํ•˜๋ฉฐ ๊ธฐ์กด์˜ Iterator๋‚˜
์ง์ ‘ ๊ตฌํ˜„ ๋ฐ˜๋ณต์ž๋ณด๋‹ค ์œ ์šฉํ•˜๊ฒŒ ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿผ ๊ธฐ์กด์˜ ์ฝ”๋“œ์™€ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€
์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ๊ธฐ์กด์˜ ์ž๋ฐ” ์ฝ”๋“œ
List<Dish> lowCaloricDishes = new ArrayList<>();
for(Dish dish: menu) {
    if(dish.getCalories() < 400) {
        lowCaloricDishes.add(dish);
    }
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
    public int(Dish dish1, Dish dish2) {
        return Integer.compare(dish1.getCalories(), dish2.getCalories());
    }
});
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish dish: lowcaloricDishes) {
    lowCaloricDishesName.add(dish.getName());
}

// Stream์„ ์ด์šฉํ•œ ์ž๋ฐ”8 ์ฝ”๋“œ
List<String> lowCaloricDishesName =
        menu.stream()
            .filter(d -> d.getCalories() < 400)
            .sorted(comparing(Dish::getCalories))
            .map(Dish::getName)
            .collect(toList());

๋จผ์ € ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ณดํ†ต ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์ฒ˜๋Ÿผ Stream๊ณผ ๋žŒ๋‹ค๋ฅผ ์กฐํ•ฉํ•˜๋ฉด
๊ต‰์žฅํžˆ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ
menu.stream() ๋ถ€๋ถ„์„ menu.parallelStream()์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์ด ์ฝ”๋“œ๋ฅผ
๋ฉ€ํ‹ฐ์ฝ”์–ด ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค
.

Stream์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์œ„์—์„œ ํ™•์ธํ•œ Stream์˜ ์žฅ์ ์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

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

์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ๋“ค์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์€ filtering, mapping๋“ฑ์„ ํ†ตํ•ด
๋ฐ์ดํ„ฐ๋ฅผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ”์–ด ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

Stream์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ

Stream์—๋Š” ์•ž์—์„œ ๋ณธ ์—ฐ์‚ฐ๋“ค์„ ํฌํ•จํ•ด ๋„ค ๊ฐ€์ง€์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

filter

๋žŒ๋‹ค๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ์ŠคํŠธ๋ฆผ์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ์ œ์™ธ์‹œํ‚ต๋‹ˆ๋‹ค.

map

๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด์„œ ํ•œ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค

limit

์ •ํ•ด์ง„ ๊ฐœ์ˆ˜ ์ด์ƒ์˜ ์š”์†Œ๊ฐ€ ์ŠคํŠธ๋ฆผ์— ์ €์žฅ๋˜์ง€ ๋ชปํ•˜๊ฒŒ ์ŠคํŠธ๋ฆผ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค

collect

์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฅธ ํ˜•์‹(์ปฌ๋ ‰์…˜ ๋“ฑ)์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Stream์˜ ํŠน์ง•

์ŠคํŠธ๋ฆผ์€ ๊ธฐ์กด์˜ ์ปฌ๋ ‰์…˜ ๋ฐฉ์‹๊ณผ ์–ด๋– ํ•œ ์ฐจ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Stream์€ ์š”์ฒญ๋  ๋•Œ์—๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค

์ปฌ๋ ‰์…˜์€ ํ˜„์žฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ŠคํŠธ๋ฆผ์€ ์ด๋ก ์ ์œผ๋กœ ์š”์ฒญํ•  ๋•Œ์—๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณ ์ •๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ
์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฐ’๋งŒ ์ŠคํŠธ๋ฆผ์—์„œ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Stream์€ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค

๋ฐ˜๋ณต์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ŠคํŠธ๋ฆผ๋„ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ํƒ์ƒ‰๋œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š”
์†Œ๋น„๋˜๋ฉฐ ํ•œ ๋ฒˆ ํƒ์ƒ‰ํ•œ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„
๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
.

Stream์€ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•œ๋‹ค

์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ for ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์ผ์„
์™ธ๋ถ€ ๋ฐ˜๋ณต์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฐ˜๋ณต์„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š”
๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์—์„œ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€๋งŒ ์ง€์ •ํ•ด์ฃผ๋ฉด
๋‚˜๋จธ์ง€ ๋ฐ˜๋ณต ์ž‘์—…์€ ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค
.

๊ฒฐ๊ตญ ์ด์™€ ๊ฐ™์€ ํŠน์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ์œผ๋กœ ์ด์–ด์ง€๋Š”๋ฐ, ์™ธ๋ถ€ ๋ฐ˜๋ณต์—์„œ๋Š” ๋ณ‘๋ ฌ์„ฑ์„
synchronized์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด ์ŠคํŠธ๋ฆผ์€
๋ฐ˜๋ณต์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.

post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€