Skip to content

Latest commit

ย 

History

History
300 lines (207 loc) ยท 21.4 KB

File metadata and controls

300 lines (207 loc) ยท 21.4 KB

item 45 : ์ŠคํŠธ๋ฆผ์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ผ

์ŠคํŠธ๋ฆผ์ด๋ž€ ์ž๋ฐ” 8๋ถ€ํ„ฐ ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…(์ˆœ์ฐจ/๋ณ‘๋ ฌ)์„ ๋•๊ณ ์ž ๋‚˜์˜จ API์ด๋ฉฐ, ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ์ ์ธ ์ถ”์ƒ ๊ฐœ๋…์„ ์ œ๊ณตํ•œ๋‹ค.

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

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, ์˜คํ† ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ ๊ณผ์ •์ด ํ•„์š” ์—†๋Š” Intstream ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ๋„ ์ œ๊ณตํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ์˜ ์›์†Œ๋“ค์€ ์–ด๋””๋กœ๋ถ€ํ„ฐ๋“  ์˜ฌ ์ˆ˜ ์žˆ ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด, ํŒŒ์ผ, ์ •๊ทœํ‘œํ˜„์‹ ํŒจํ„ด ๋งค์ฒ˜(matcher), ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ, ํ˜น์€ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์ด ์žˆ๋‹ค.

{% hint style="info" %} ์ŠคํŠธ๋ฆผ ์•ˆ์˜ ๋ฐ์ดํ„ฐ ์›์†Œ๋“ค์€ ๊ฐ์ฒด ์ฐธ์กฐ๋‚˜ ๊ธฐ๋ณธ ํƒ€์ž…๊ฐ’์ด๋‹ค. ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’์œผ๋กœ๋Š” int, long, double์„ ์ง€์›ํ•˜๋Š”๋ฐ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฒฝ์šฐ IntStream, LongStream, DoubleStream๊ณผ ๊ฐ™์€ Stream์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์„ฑ๋Šฅ์ƒ ์ข‹๋‹ค. {% endhint %}

  • Stream - ๊ฐ์ฒด ์ฐธ์กฐ์— ๋Œ€ํ•œ Stream
  • IntStream - int ํƒ€์ž…์— ๋Œ€ํ•œ Stream
  • LongStream - long ํƒ€์ž…์— ๋Œ€ํ•œ Stream
  • DoubleStream - double ํƒ€์ž…์— ๋Œ€ํ•œ Stream

๐Ÿ”– ์ŠคํŠธ๋ฆผ์˜ ์ถ”์ƒ ๊ฐœ๋…
1. ์ŠคํŠธ๋ฆผ(stream) : ๋ฐ์ดํ„ฐ ์›์†Œ์˜ ์œ ํ•œ ํ˜น์€ ๋ฌดํ•œ ์‹œํ€€์Šค
2. ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ(stream pipeline) : ์ด ์›์†Œ๋“ค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฐ์‚ฐ ๋‹จ๊ณ„๋ฅผ ํ‘œํ˜„

๐ŸŒฑ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ

์ด๋ฏธ์ง€ ๋ถ„์„

  1. Stream Source: ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜, I/O ์ฑ„๋„ ๋“ฑ ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  2. Intermediate Operations: ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ํƒ€์ž… ๋ณ€ํ™˜, ๋งคํ•‘ ๋“ฑ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ํฌํ•จ๋œ๋‹ค. ์ด ์—ฐ์‚ฐ๋“ค์€ ์ŠคํŠธ๋ฆผ์„ ๊ณ„์† ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ์Šคํƒ€์ผ๋กœ ์—ฐ๋‹ฌ์•„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Terminal Operation: ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•˜์—ฌ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด collect, sum, count์™€ ๊ฐ™์€ ์—ฐ์‚ฐ๋“ค์ด ์žˆ๋‹ค.
  4. Operation Result: ์ตœ์ข… ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ€๋ถ„

https://sas-study.tistory.com/239 ์ด๋ฏธ์ง€ ์ฐธ๊ณ 

๐ŸŒฑ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์€ ์†Œ์Šค ์ŠคํŠธ๋ฆผ์—์„œ ์‹œ์ž‘ํ•ด ์ข…๋‹จ ์—ฐ์‚ฐ์œผ๋กœ ๋๋‚˜๋ฉฐ, ๊ทธ ์‚ฌ์ด์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

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

1. ์ค‘๊ฐ„ ์—ฐ์‚ฐ(Intermediate Operation)

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

  • filter(), map(), sorted()
๋ฉ”์„œ๋“œ ์„ค๋ช…
filter(Predicate<? super T> predicate) ์ง€์ •๋œ predicate ํ•จ์ˆ˜์— ๋งž๋Š” ์š”์†Œ๋งŒ ์ŠคํŠธ๋ฆผ์— ํฌํ•จํ•˜๋„๋ก ํ•„ํ„ฐ๋ง
map(Function<? super T, ? extends R> function) ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ์— function์„ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์š”์†Œ๋กœ ๋ณ€ํ™˜
flatMap(Function<? super T, ? extends Stream<? extends R>> function) ๊ฐ ์š”์†Œ์— function์„ ์ ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ‰ํƒ„ํ™”
distinct() ์ŠคํŠธ๋ฆผ์˜ ์ค‘๋ณต ์š”์†Œ๋ฅผ ์ œ๊ฑฐ
sorted() ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ ์ •๋ ฌ(์˜ค๋ฆ„์ฐจ์ˆœ)
sorted(Comparator<? super T> comparator) ์ง€์ •๋œ comparator ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ •๋ ฌ
skip(long n) ์ŠคํŠธ๋ฆผ์˜ ์ฒซ n๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋œ€
limit(long maxSize) ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ์ค‘ ์ตœ๋Œ€ maxSize ๊ฐœ์ˆ˜๋งŒํผ๋งŒ ๋ฐ˜ํ™˜๋‹ค.

2. ์ข…๋‹จ ์—ฐ์‚ฐ(Terminal Operation)

์ข…๋‹จ ์—ฐ์‚ฐ์€ ๋งˆ์ง€๋ง‰ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ๋‚ด๋†“์€ ์ŠคํŠธ๋ฆผ์— ์ตœํ›„์˜ ์—ฐ์‚ฐ์„ ๊ฐ€ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ์›์†Œ๋ฅผ ์ •๋ ฌํ•ด ์ปฌ๋ ‰์…˜์— ๋‹ด๊ฑฐ๋‚˜ ํŠน์ • ์›์†Œ๋ฅผ ํ•˜๋‚˜ ์„ ํƒํ•˜๋Š” ์‹์ด๋‹ค.

  • forEach(), collect(), match(), count(), reduce()

Java Stream API์˜ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ์™€ ์„ค๋ช…์„ ํ‘œ๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์„ค๋ช…
forEach(Consumer<? super T> consumer) ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ๋ฅผ consumer์— ์ „๋‹ฌํ•˜์—ฌ ์ˆœํšŒํ•˜๋ฉฐ ์†Œ๋น„ํ•œ๋‹ค.
count() ์ŠคํŠธ๋ฆผ ๋‚ด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
max(Comparator<? super T> comparator) comparator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ๋‚ด์˜ ์ตœ๋Œ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
min(Comparator<? super T> comparator) comparator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ๋‚ด์˜ ์ตœ์†Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
allMatch(Predicate<? super T> predicate) ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ predicate์— ๋งŒ์กฑํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
anyMatch(Predicate<? super T> predicate) ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ predicate์— ๋งŒ์กฑํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
sum() ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ํ•ฉ๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (IntStream, LongStream, DoubleStream์— ์‚ฌ์šฉ)
average() ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ํ‰๊ท  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (IntStream, LongStream, DoubleStream์— ์‚ฌ์šฉ)
List<Integer> transactionsIds = 
    transactions.stream()
                .filter(t -> t.getType() == Transaction.GROCERY)
                .sorted(comparing(Transaction::getValue).reversed())
                .map(Transaction::getId)
                .collect(toList());

https://www.geeksforgeeks.org/java-8-stream-tutorial/

  1. Stream<Transaction> ์ƒ์„ฑ: ๋‹ค์–‘ํ•œ Transaction ๊ฐ์ฒด๋“ค์ด ์ŠคํŠธ๋ฆผ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  2. filter ๋‹จ๊ณ„: t -> t.getType() == Transaction.GROCERY ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” Transaction ๊ฐ์ฒด๋“ค๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ Stream<Transaction>์„ ์ƒ์„ฑํ•œ๋‹ค.
  3. sorted ๋‹จ๊ณ„: Transaction ๊ฐ์ฒด๋“ค์„ ๊ฐ’ (getValue()) ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
  4. map ๋‹จ๊ณ„: ๊ฐ Transaction ๊ฐ์ฒด์˜ id๋งŒ ์ถ”์ถœํ•˜์—ฌ Stream<Integer>๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  5. collect ๋‹จ๊ณ„: ์ตœ์ข…์ ์œผ๋กœ collect(toList())๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ List<Integer>๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์ŠคํŠธ๋ฆผ ์ž‘์—…์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ํ•„ํ„ฐ๋งํ•˜๊ณ , ์ •๋ ฌํ•œ ํ›„, ID๋งŒ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

๐ŸŒฑ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ ํŠน์ง•

1. ์ง€์—ฐ ํ‰๊ฐ€(lazy evaluation)

์ง€์—ฐํ‰๊ฐ€๋Š” ์ข…๋‹จ ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋  ๋•Œ ์ด๋ค„์ง€๋ฉฐ, ์ข…๋‹จ ์—ฐ์‚ฐ์— ์“ฐ์ด์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ๋Š” ๊ณ„์‚ฐ์— ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค. ์ด ํ•œ ์ง€์—ฐ ํ‰๊ฐ€๊ฐ€ ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ด์‡ ๋‹ค. ์ข…๋‹จ ์—ฐ์‚ฐ์ด ์—†๋Š” ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์€ ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š” ๋ช…๋ น์–ด์ธ no-op๊ณผ ๊ฐ™์œผ๋‹ˆ, ์ข…๋‹จ ์—ฐ์‚ฐ์„ ๋นผ๋จน๋Š” ์ผ์ด ์ ˆ๋Œ€ ์—†๋„๋ก ํ•˜์ž.

๋จผ์ € ์ง€์—ฐ์ด๋ž€ ๊ฒฐ๊ณผ๊ฐ’์ด ํ•„์š”ํ• ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋Šฆ์ถ”๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์–ด๋Š ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ํฐ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ?

๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์—์„œ, ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋“ค์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ข…๋‹จ ์—ฐ์‚ฐ์— ์“ฐ์ด์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ๋Š” ๊ณ„์‚ฐ ์ž์ฒด์— ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ Short-Circuit ๋ฐฉ์‹์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html
Java Stream API์—์„œ "Short-circuiting Operations"(๋‹จ๋ฝ ์—ฐ์‚ฐ)

ํ•ด์„ ์ „์— ์š”์†Œ๋“ค์„ ๋ด๋ณด์ž,

{% hint style="info" %} ๋‹จ๋ฝ ์—ฐ์‚ฐ์€ ์ „์ฒด ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ ๋„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์กฐ๊ธฐ์— ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค. {% endhint %}

  1. Intermediate Operation (์ค‘๊ฐ„ ์—ฐ์‚ฐ):
    • limit(): ์ŠคํŠธ๋ฆผ์—์„œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด limit(5)๋Š” ์ŠคํŠธ๋ฆผ์˜ ์ฒ˜์Œ 5๊ฐœ ์š”์†Œ๋งŒ์„ ํฌํ•จํ•˜๋Š” ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•œ๋‹ค.
    • limit()๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ๊ณ„์†ํ•ด์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. Terminal Operations (์ข…๊ฒฐ ์—ฐ์‚ฐ):
    • findFirst(): ์ŠคํŠธ๋ฆผ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • findAny(): ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹Œ ์ž„์˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ์ž„์˜์˜ ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ฉด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
    • anyMatch(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‚˜๋จธ์ง€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.
    • allMatch(): ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
    • noneMatch(): ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์„ค๋ช…

  • Limiting a size: limit() ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ์˜ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Finding an element: findFirst()์™€ findAny()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ฉด ์—ฐ์‚ฐ์ด ์ข…๋ฃŒ
  • Testing a match: anyMatch(), allMatch(), noneMatch() ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, JVM ์€ ๊ณง๋ฐ”๋กœ ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์„ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ์ตœ์†Œํ•œ์œผ๋กœ ํ•„์ˆ˜์ ์ธ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ๊ฒ€์‚ฌ๋ฅผ ๋จผ์ € ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ด ๊ณ„ํšํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณ„ํš์— ๋”ฐ๋ผ ๊ฐœ๋ณ„ ์š”์†Œ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 10000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์ค‘์— ๊ธธ์ด๊ฐ€ 5๊ฐ€ ๋„˜๋Š” ๋ฌธ์ž์—ด์—์„œ ๊ฐ€์žฅ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์•ž์— ์žˆ๋Š” 2๊ฐœ์˜ ๋ฌธ์ž์—ด๋งŒ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ง€์—ฐ ํ‰๊ฐ€๊ฐ€ ์—†์ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐ”๋กœ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด, 10000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์–ด์งœํ”ผ ์ตœ์ข…์ ์œผ๋กœ 2๊ฐœ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋˜๋Š”๋ฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?

  1. limit ์‚ฌ์šฉ O\

  2. limit ์‚ฌ์šฉ X\

๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด์ž. limit(n) ์—ฐ์‚ฐ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ž์‹ ์—๊ฒŒ ๋„๋‹ฌํ•œ ์š”์†Œ๊ฐ€ n ๊ฐœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์ŠคํŠธ๋ฆผ ๋‚ด ๋‹ค๋ฅธ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์ˆœํšŒํ•˜์ง€ ์•Š๊ณ  ํƒˆ์ถœํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธธ์ด๊ฐ€ 5๊ฐ€ ๋„˜๋Š” ๋ฐ์ดํ„ฐ 4 ๊ฐœ๊ฐ€ ์•„๋‹Œ, ๋งจ ์•ž์— 2 ๊ฐœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.\

์˜ˆ์™ธ ์‚ฌํ•ญ: Stateful operations

์ด๋Ÿฌํ•œ ์ง€์—ฐ ํ‰๊ฐ€ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด, ์šฐ๋ฆฌ๋Š” ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์€ ์• ์ดˆ์— ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์€ ๋งŒํผ, ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ํ•˜์ง€ ๋ชปํ•œ๋‹ค . ํ•˜์ง€๋งŒ limit() ๊ณผ ๊ฐ™์€ short-circuit ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์œ ํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™คํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๐Ÿ”– ์œ ํ•œ ์ŠคํŠธ๋ฆผ vs ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ
1. ์œ ํ•œ ์ŠคํŠธ๋ฆผ : ์ƒ์„ฑํ•  ๋•Œ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ

IntStream ints(long streamsize, int begin, int end)

2.๋ฌดํ•œ ์ŠคํŠธ๋ฆผ : ๋ฌดํ•œํ•œ ํฌ๊ธฐ๋กœ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ŠคํŠธ๋ฆผ

IntStream ints(int begin, int end)

์ด์ฒ˜๋Ÿผ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” distinct() ๋‚˜, ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” sort() ์—ฐ์‚ฐ๋“ค์„ Stateful ์—ฐ์‚ฐ์ด๋ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์ง€์—ฐ ํ‰๊ฐ€๋ฅผ ๋ฌดํšจํ™”์‹œํ‚ค๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ด๋ณด์ž.

limit() ์„ ๊ฑธ์–ด์ฃผ์—ˆ์Œ์—๋„, sorted() ์œผ๋กœ ์ธํ•ด ๊ธธ์ด๊ฐ€ 5๊ฐ€ ๋„˜๋Š” ๋ชจ๋“  ๋„ค๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ฒจ ์ง€์—ฐ ํ‰๊ฐ€๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2. ์ˆœ์ฐจ์„ฑ

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

๐ŸŒฑ ๋ฐ˜๋ณต๋ฌธ์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฌด์กฐ๊ฑด ๋ฐ”๊พธ๋Š”๊ฒƒ์ด ์ข‹์„๊นŒ?

์ŠคํŠธ๋ฆผ์„ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์งง๊ณ  ๊น”๋”ํ•ด์ง€์ง€๋งŒ, ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐฉ๋ฒ•์€?

1. ๋ชจ๋“  ๋ฐ˜๋ณต๋ฌธ์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ๋ณด๋‹ค, ๋ฐ˜๋ณต๋ฌธ๊ณผ ์ŠคํŠธ๋ฆผ์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜์ž.

๋‹ค์Œ ์ฝ”๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€, ์‚ฌ์ „ ํŒŒ์ผ์—์„œ ๋‹จ์–ด๋ฅผ ์ฝ์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธํ„ฑ๊ฐ’๋ณด๋‹ค ์›์†Œ ์ˆ˜๊ฐ€ ๋งŽ์€ ์•„๋‚˜๊ทธ๋žจ ๊ทธ๋ฃน์„ ์ถœ๋ ฅํ•œ๋‹ค. (์ฒ ์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™๊ณ  ์ˆœ์„œ๋งŒ ๋‹ค๋ฅธ ๋‹จ์–ด)

public class Anagrams {
	  public static void main(String[] args) throws IOException {
      File dictionary = new File(args[0]);
      int minGroupSize = Interger.parseInt(args[1]);
      
      Map<String, Set<String>> groups = new HashMap<>();
      try(Scanner s = new Scanner(dictionary)){
      	while(s.hasNext()){
        	String word = s.next();
            groups.computeIfAbsent(alphabetize(word), (unused) -> new TreeSet<>()).add(word);
        }
      }
      
      for(Set<String> group : groups.values())
      	if(group.size() >= minGroupSize)
        	System.out.println(group.size() + ":" + group);
    }
    
    public static String alphabetie(String s){
    	char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }
}
  • computeIfAbsent() : ๋งต ์•ˆ์— ํ‚ค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋งคํ•‘๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†๋‹ค๋ฉด ๊ฑด๋„ค์ง„ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ‚ค์— ์ ์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ ํ‚ค์™€ ๊ฐ’์„ ๋งคํ•‘ํ•ด๋†“๊ณ , ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜
 try (Stream<String> words = Files.lines(dictionary)) {
       words.collect(
               groupingBy(word -> word.chars().sorted()
                       .collect(StringBuilder::new,
                               (sb, c) -> sb.append((char) c),
                                    StringBuilder::append).toString()))
               .values().stream()
               .filter(group -> group.size() >= minGroupSize)
               .map(group -> group.size() + ": " + group)
               .forEach(System.out::println);
        }
    }
}

์ŠคํŠธ๋ฆผ์„ ๊ณผํ•˜๊ฒŒ ํ™œ์šฉํ•˜์—ฌ, ์‚ฌ์ „ ํŒŒ์ผ ์—ฌ๋Š” ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๊ฐ€ ๋‹จ ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ์„ ๊ณผ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ฝ๊ฑฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

์ŠคํŠธ๋ฆผ์„ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜๊ธฐ

 try (Stream<String> words = Files.lines(dictionary)) {
       words.collect(groupingBy(word -> alphabetize(word)))
               .values().stream()
               .filter(group -> group.size() >= minGroupSize)
               .forEach(g -> System.out.println(g.size() + ": " + g));
  }

alphabetize() ๊ณผ ๊ฐ™์€ ์„ธ๋ถ€ ๊ตฌํ˜„์€ ์ฃผ ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง ๋ฐ–์œผ๋กœ ๋นผ๋‚ด ์ „์ฒด์ ์ธ ๊ฐ€๋…์„ฑ์„ ๋†’์˜€๋‹ค. ์ด์ฒ˜๋Ÿผ ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋Š” ์ผ์˜ ์ค‘์š”์„ฑ์€ ์ผ๋ฐ˜ ๋ฐ˜๋ณต ์ฝ”๋“œ์—์„œ๋ณด๋‹ค๋Š” ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ›จ์”ฌ ์ปค์ง„๋‹ค.

๐Ÿ”– ๋žŒ๋‹ค์—์„œ๋Š” ํƒ€์ž… ์ด๋ฆ„์„ ์ž์ฃผ ์ƒ๋žตํ•˜๋ฏ€๋กœ, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ž˜ ์ง€์–ด์•ผ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฐ€๋…์„ฑ์ด ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.char ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

์ž๋ฐ”๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ char ์šฉ ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ์ •์ˆ˜๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ boolean[], byte[], short[], char[], float[] ๋„ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

"Hello World!".chars().forEach(System.out::print); // ์ •์ˆ˜๊ฐ’์ด ์ถœ๋ ฅ๋จ : 739488237102..

๐ŸŒฑ ์ŠคํŠธ๋ฆผ์˜ ์ ์ ˆํ•œ ํ™œ์šฉ

์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋˜ํ’€์ด ๋˜๋Š” ๊ณ„์‚ฐ์„ ์ฃผ๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด(๋žŒ๋‹ค/๋ฉ”์„œ๋“œ ์ฐธ์กฐ)๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๋ฐ˜๋ณต ์ฝ”๋“œ์—๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด ํ‘œํ˜„ํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ

์ŠคํŠธ๋ฆผ๊ณผ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ๋Š” ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ๋Š” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ฝ”๋“œ ๋ธ”๋ก์—์„œ๋Š” ๋ฒ”์œ„ ์•ˆ์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋žŒ๋‹ค์—์„œ๋Š” ์‚ฌ์‹ค์ƒ final ์ธ ๋ณ€์ˆ˜๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ์ง€์—ญ๋ณ€์ˆ˜ ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ์ฝ”๋“œ ๋ธ”๋ก์—์„œ๋Š” return / break / continue ๋ฌธ์œผ๋กœ ๋ธ”๋ก์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜, ๋ฉ”์„œ๋“œ ์„ ์–ธ์— ๋ช…์‹œ๋œ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋žŒ๋‹ค๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ŠคํŠธ๋ฆผ์„ ์ ์šฉํ•˜๊ธฐ ์ข‹์€ ๊ฒฝ์šฐ

  1. ์›์†Œ๋“ค์˜ ์‹œํ€€์Šค๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ : map()
  2. ์›์†Œ๋“ค์˜ ์‹œํ€€์Šค๋ฅผ ํ•„ํ„ฐ๋ง ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ : filter()
  3. ์›์†Œ๋“ค์˜ ์‹œํ€€์Šค๋ฅผ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(๋”ํ•˜๊ธฐ, ์—ฐ๊ฒฐํ•˜๊ธฐ, ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ ๋“ฑ) :
  4. ์›์†Œ๋“ค์˜ ์‹œํ€€์Šค๋ฅผ ์ปฌ๋ ‰์…˜์— ๋ชจ์œผ๋Š” ๊ฒฝ์šฐ(๊ณตํ†ต๋œ ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ) : collect()
  5. ์›์†Œ๋“ค์˜ ์‹œํ€€์Šค์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์›์†Œ๋ฅผ ์ฐพ์„ ๊ฒฝ์šฐ : filter()

๐ŸŒฑ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ

ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ํ†ต๊ณผํ•ด์•ผํ• ๋•Œ, ์ด ๋ฐ์ดํ„ฐ์˜ ๊ฐ ๋‹จ๊ณ„์—์„œ์˜ ๊ฐ’๋“ค์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์€ ์ผ๋‹จ ํ•œ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์— ๋งคํ•‘ํ•˜๊ณ  ๋‚˜๋ฉด ์›๋ž˜์˜ ๊ฐ’์€ ์žƒ๋Š” ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ”– ํ•ต์‹ฌ ์ •๋ฆฌ
์ŠคํŠธ๋ฆผ๊ณผ ๋ฐ˜๋ณต ์ค‘ ์–ด๋Š์ชฝ์ด ๋‚˜์€์ง€ ํ™•์‹ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด, ๋‘˜ ๋‹ค ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ๋” ๋‚˜์€ ์ชฝ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Statelessness
https://bugoverdose.github.io/development/stream-lazy-evaluation/

https://velog.io/@semi-cloud/Effective-Java-%EC%95%84%EC%9D%B4%ED%85%9C-45-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%80-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC

https://kdg-is.tistory.com/378