STREAM2
์ซ์ํ ์คํธ๋ฆผ
reduce ๋ฉ์๋๋ก ์คํธ๋ฆผ ์์์ ํฉ์ ๊ตฌํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ง๋ง ์ ์ฝ๋์์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ ์ Integer๋ฅผ ๊ธฐ๋ณธํ์ผ๋ก ์ธ๋ฐ์ฑํด์ผํ๋ค.
5.7.1 ๊ธฐ๋ณธํ ํนํ ์คํธ๋ฆผ
์คํธ๋ฆผ API๋ ๋ฐ์ฑ ๋น์ฉ์ ํผํ ์ ์๋๋ก IntStream, DoubleStream, LoingStream์ ์ ๊ณตํ๋ค.
๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ sum, max์ ๊ฐ์ ์ซ์ ๊ด๋ จ ๋ฆฌ๋์ฑ ์ฐ์ฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ค์ ๊ฐ์ฒด ์คํธ๋ฆผ์ผ๋ก ๋ณต์ํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
์ซ์ ์คํธ๋ฆผ์ผ๋ก ๋งคํ
mapToInt ๋ฉ์๋๋ ๊ฐ ์๋ฆฌ์์ ๋ชจ๋ ์นผ๋ก๋ฆฌ(Intergerํ์)๋ฅผ ์ถ์ถํ ๋ค์์ IntStream์(Stream<Integer>๊ฐ ์๋) ๋ฐํํ๋ค. ์คํธ๋ฆผ์ด ๋น์ด์์ผ๋ฉด sum์ ๊ธฐ๋ณธ๊ฐ 0์ ๋ฐํํ๋ค.
๊ฐ์ฒด ์คํธ๋ฆผ์ผ๋ก ๋ณต์ํ๊ธฐ
boxed ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํนํ ์คํธ๋ฆผ์ ์ผ๋ฐ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ ์ ์๋ค.
๊ธฐ๋ณธ๊ฐ: OptionalInt
Optional์ Integer, String ๋ฑ์ ์ฐธ์กฐ ํ์์ผ๋ก ํ๋ผ๋ฏธํฐํํ ์ ์์ผ๋ฉฐ, OptionalInt, OptionalDouble, OptionalLoing ์ธ ๊ฐ์ง ๊ธฐ๋ณธํ ํนํ ์คํธ๋ฆผ ๋ฒ์ ๋ ์ ๊ณตํ๋ค.
5.7.2 ์ซ์ ๋ฒ์
IntStream๊ณผ LongStream์์๋ range์ rangeClosed๋ผ๋ ๋ ๊ฐ์ง ์ ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ๋ ๋ฉ์๋ ๋ชจ๋ ์์๊ฐ๊ณผ ์ข ๋ฃ๊ฐ์ ์ธ์๋ก ๊ฐ์ง๋ค.
range ๋ฉ์๋๋ ์์๊ฐ๊ณผ ์ข ๋ฃ๊ฐ์ด ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์๋ ๋ฐ๋ฉด, rangeClosed๋ ์์๊ฐ๊ณผ ์ข ๋ฃ๊ฐ์ด ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค.
5.7.3 ์ซ์ ์คํธ๋ฆผ ํ์ฉ : ํผ๋ผ๊ณ ๋ผ์ค ์
ํ ๋จ๊ณ์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๊ฐ๋ฉฐ ์ซ์ ์คํธ๋ฆผ๊ณผ ์คํธ๋ฆผ ์ฐ์ฐ์ ํ์ฉํด 'ํผํ๊ณ ๋ผ์ค ์' ์คํธ๋ฆผ์ ๋ง๋ค์ด๋ณด์.
ํผํ๊ณ ๋ผ์ค ์
a x a + b x b = c x c
์ธ ์ ํํํ๊ธฐ
int ๋ฐฐ์ด์ ๋จผ์ ์ ์ํ์. ์๋ฅผ ๋ค์ด (3,4,5)๋ฅผ new int[] {3, 4, 5}๋ก ํํํ ์ ์๋ค.
์ข์ ํํฐ๋ง ์กฐํฉ
ํผํ๊ณ ๋ผ์ค ์ ์๋ฅผ ๋ง์กฑํ๋ ์ ์ ์กฐํฉ์ ์ฐพ์๋ณด์.
a์ b ๋ ์๊ฐ ์์๋ c๊ฐ ์ ์์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Math.sqrt(a*a + b*b) % 1 == 0;
์งํฉ ์์ฑ
์ ์ ์กฐํฉ์ ํํฐ๋งํ ํ์ map์ ์ด์ฉํด ๊ฐ ์์๋ฅผ ํผํ๊ณ ๋ผ์ค ์๋ก ๋ณํํ ์ ์๋ค.
b๊ฐ ์์ฑ
Stream.rangeClosed๋ก b ๊ฐ์ ๋ฒ์๋ฅผ ์์ฑํด๋ณด์.
IntStream์ map์ ์คํธ๋ฆผ์ ๊ฐ ์์๋ก int๊ฐ ๋ฐํ๋ ๊ฒ์ ๊ธฐ๋ํ๋ค. ๋ฐ๋ผ์ boxed ๋ฉ์๋๋ก Stream<Integer>ํํ๋ก ๋ณํํ ํ์ map ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, IntStream์ mapToObj ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
a๊ฐ ์์ฑ
๋ง์ง๋ง์ผ๋ก a๊ฐ์ ์์ฑํ๋ค.
์คํธ๋ฆผ a์ ๊ฐ์ ๋งคํํ๋ฉด ์คํธ๋ฆผ์ ์คํธ๋ฆผ์ด ๋ง๋ค์ด์ง๋ฏ๋ก flatMap ๋ฉ์๋๋ฅผ ์ด์ฉํด ํ์คํํ๋ค.
์ค๋ณต๋ ์๋ฅผ ๋ฐฉ์งํ๊ธฐ์ํด b ๊ฐ์ ๋ฒ์๋ (a, 100)์ผ๋ก ๋ณ๊ฒฝํ๋ค.
๊ฐ์ ํ ์ ?
ํ์ฌ ์ฝ๋์์๋ ์ ๊ณฑ๊ทผ์ ๋๋ฒ ๊ณ์ฐํ๋ค. ์ํ๋ ์กฐ๊ฑด์ ๊ฒฐ๊ณผ๋ง ํํฐ๋งํ๋๋ก ์์ ํด๋ณด์.
5.8 ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
5.8.1 ๊ฐ์ผ๋ก ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
์์์ ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ์ ์ ๋ฉ์๋ Stream.of๋ฅผ ์ด์ฉํด์ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
empty ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์คํธ๋ฆผ์ ๋น์ธ ์ ์๋ค.
5.8.2 null์ด ๋ ์ ์๋ ๊ฐ์ฒด๋ก ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
ofNullable ๋ฉ์๋๋ก null์ด ๋ ์ ์๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
์ด ํจํด์ flatMap๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ์ํฉ์์ ์ ์ฉํ๋ค.
5.8.3 ๋ฐฐ์ด๋ก ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ๋ ์ ์ ๋ฉ์๋ Arrays.stream์ ์ด์ฉํด์ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
5.8.4 ํ์ผ๋ก ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
ํ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ I/O ์ฐ์ฐ์ ์ฌ์ฉํ๋ ์๋ฐ์ NIO API(๋น๋ธ๋ก I/O)๋ ์คํธ๋ฆผ API๋ฅผ ํ์ฉํ ์ ์๋ค.
Files.lines๋ก ํ์ผ์ ๊ฐ ํ ์์๋ฅผ ๋ฐํํ๋ ์คํธ๋ฆผ์ ์ป์ ์ ์๋ค.
Stream ์ธํฐํ์ด์ค๋ AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฏ๋ก, try ๋ธ๋ก ๋ด์ ์์์ ์๋์ผ๋ก ๊ด๋ฆฌ๋๋ค.
5.8.5 ํจ์๋ก ๋ฌดํ ์คํธ๋ฆผ ๋ง๋ค๊ธฐ
Stream.iterate์ Stream.generate๋ฅผ ์ด์ฉํด์ ํจ์์์ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
๋ ์ฐ์ฐ์ ์ด์ฉํ๋ฉด ๋ฌดํ ์คํธ๋ฆผ, ์ฆ ๊ณ ์ ๋ ์ปฌ๋ ์ ์์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ์คํธ๋ฆผ์ ๋ง๋ค์๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ง ์์ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
iterate ๋ฉ์๋
iterate ๋ฉ์๋๋ ์ด๊น๊ฐ๊ณผ ๋๋ค๋ฅผ ์ธ์๋ก ๋ฐ์์ ์๋ก์ด ๊ฐ์ ๋์์ ์ด ์์ฐํ ์ ์๋ค.
์์ ์์๋ ๋๋ค n -> n+2, ์ฆ ์ด์ ๊ฒฐ๊ณผ์ 2๋ฅผ ๋ํ ๊ฐ์ ๋ฐํํ๋ค.
iterate๋ ์์ฒญํ ๋๋ง๋ค ๊ฐ์ ์์ฐํ ์ ์์ผ๋ฉฐ ๋์ด ์์ผ๋ฏ๋ก ๋ฌดํ ์คํธ๋ฆผ์ ๋ง๋ ๋ค. ์ด๋ฌํ ์คํธ๋ฆผ์ ์ธ๋ฐ์ด๋ ์คํธ๋ฆผ์ด๋ผ๊ณ ํํํ๋ค.
iterate ๋ฉ์๋๋ ํ๋ ๋์ผ์ดํธ๋ฅผ ์ง์ํ๋ค. ๋ ๋ฒ์งธ ์ธ์๋ก ํ๋ ๋ ์ผ์ดํธ๋ฅผ ๋ฐ์ ์์ ์ค๋จ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๋ค.
0์์ ์์ํด์ 100๋ณด๋ค ํฌ๋ฉด ์ซ์ ์์ฑ์ ์ค๋จํ๋ ์ฝ๋๋ฅผ ๋ค์์ฒ๋ผ ๊ตฌํํ ์ ์๋ค.
filter๋ก๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ ์๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, filter ๋ฉ์๋๋ ์ธ์ ์ด ์์ ์ ์ค๋จํด์ผ ํ๋์ง ์ ์ ์๋ค.
์ด๋ด ๋์๋ talkWhile ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
generate ๋ฉ์๋
iterate์ ๋ฌ๋ฆฌ generate๋ ์์ฐ๋ ๊ฐ ๊ฐ์ ์ฐ์์ ์ผ๋ก ๊ณ์ฐํ์ง ์์ผ๋ฉฐ, Supplier<T>๋ฅผ ์ธ์๋ก ๋ฐ์์ ์๋ก์ด ๊ฐ์ ์์ฐํ๋ค.
์ ์ฝ๋๋ 0์์ 1 ์ฌ์ด์ ์์์ ๋๋ธ ์ซ์ 5๊ฐ๋ฅผ ๋ง๋ ๋ค.
Last updated
Was this helpful?