MapleStory Finger Point

๐ŸŸค JAVA/๐ŸŸค JAVA ๊ฐœ๋…์ •๋ฆฌ

[JAVA 8+] Stream API

HYEJU01 2024. 12. 6. 19:48
 

๋ชฉ์ฐจ

 

     

     

     

    Stream API ๋ž€ ?

    Java 8 ์—์„œ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ์ปฌ๋ ‰์…˜ / ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

    ๋ฐ์ดํ„ฐ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

     

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

     

    Stream (Java Platform SE 8 )

    A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

    docs.oracle.com

     

     

     

    Stream API ํŠน์ง• 

    • ์›๋ณธ ๋ณ€๊ฒฝ ์•ˆํ•จ
    • ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ
    • ์ง€์—ฐ ํ‰๊ฐ€

     

     

    Stream ๋ฉ”์„œ๋“œ

    ๊ณต์‹ ๋ฌธ์„œ์— ๋“ค์–ด๊ฐ€๋ฉด ๋” ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    ์ค‘๊ฐ„ ์—ฐ์‚ฐ (Intermediate Operations)

    ์ŠคํŠธ๋ฆผ์„ ๋ณ€ํ˜•, ํ•„ํ„ฐ๋ง

    • `filter()` : ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋งŒ ๋ฐ˜ํ™˜
    • `map()` : ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ 
    • `mapToInt()` : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ IntStream์„ ์ƒ์„ฑ
    • `sorted()` : ์š”์†Œ๋ฅผ ์ •๋ ฌํ•จ
    • `flatMap()` : ๊ฐ ์š”์†Œ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ (๋ชจ๋“  ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜๋กœ ํ‰ํƒ„ํ™”)
    • `distinct()` : ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐ
    • `limit()` : ์ŠคํŠธ๋ฆผ์˜ ๊ธธ์ด๋ฅผ ์ œํ•œ
    • `skip()` ์ŠคํŠธ๋ฆผ์˜ ์ฒ˜์Œ ๋ช‡ ๊ฐœ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋œ€
    • `peek()` ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ž‘์—… ์ˆ˜ํ–‰ (๋””๋ฒ„๊น…์šฉ)

     

    ์ตœ์ข… ์—ฐ์‚ฐ (Terminal Operations)

    ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•˜์—ฌ ๊ฒฐ๊ณผ ์ƒ์„ฑ

    ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๋ฉด ์ŠคํŠธ๋ฆผ์€ ๋”์ด์ƒ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

    • `forEach()` : ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ง€์ • ์ž‘์—…์„ ์ˆ˜ํ–‰
    • `collect()` : ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์ˆ˜์ง‘
    • `reduce()` : ์š”์†Œ๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์ถ•์†Œ
    • `count()` : ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    • `min()` / `max()` : ์ตœ์†Œ๊ฐ’ ์ตœ๋Œ€๊ฐ’ ๋ฐ˜ํ™˜
    • `findFirst()` : ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜
    • `findAny()` : ์•„๋ฌด ์š”์†Œ๋‚˜ ๋ฐ˜ํ™˜
    • `allMatch()` / `anyMatch()` / `noneMatch()` : ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ
    • `toArray()` : ์ŠคํŠธ๋ฆผ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
    • `orElse()`  : Optional ๊ฐ์ฒด์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋˜๋ฉฐ, ๊ฐ’์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ (๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ ๋ฌด์‹œ) , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์ข…๋ฃŒ ( ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ์ตœ์ข… ์—ฐ์‚ฐ)
    • `average()` : ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด ํ‰๊ท  ๊ฐ’์„ ๊ณ„์‚ฐ (OptionalDouble๋กœ ๋ฐ˜ํ™˜ํ•จ!)

     

     

    Stream ์˜ˆ์ œ

     

     

    List<String> result = stream.collect(Collectors.toList());

    ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋“ค์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

     

     

    stream.sorted(Comparator.reverseOrder());

    ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ