Stream
Last updated
Last updated
Stream์ Java8๋ถํฐ ์ถ๊ฐ๋ Collection์ ์ ์ฅ ์์๋ฅผ ํ๋์ฉ ์ฐธ์กฐํด์ Lambda์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฐ๋ณต์์ด๋ค.
Stream์ Iterator์ ๋น์ทํ ์ญํ ์ ํ๋ ๋ฐ๋ณต์ ์ด์ง๋ง ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
๋๋ค์์ผ๋ก ์์ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ค.
๋ด๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํด ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ฝ๋ค.
์ธ๋ถ ๋ฐ๋ณต์(external iterator)๋ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ก ์ง์ Collection์ ์์๋ฅผ ๋ฐ๋ณตํด์ ๊ฐ์ ธ์ค๋ ํจํด์ ๋งํ๋ค. for๋ฌธ, Iterator๋ฅผ ์ด์ฉํ๋ whlie๋ฌธ ๋ชจ๋ ์ธ๋ถ ๋ฐ๋ณต์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
๋ด๋ถ ๋ฐ๋ณต์(internal iterator)๋ Collection ๋ด๋ถ์์ ์์๋ค์ ๋ฐ๋ณต์ํค๊ณ , ๊ฐ๋ฐ์๋ ์์๋น ์ฒ๋ฆฌํด์ผํ ์ฝ๋๋ง ์ ๊ณตํ๋ ํจํด์ ๋งํ๋ค. ๋ด๋ถ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฐ์๋ ์์ ์ฒ๋ฆฌ ์ฝ๋์๋ง ์ง์คํ ์ ์์ผ๋ฉฐ, ๋ด๋ถ ๋ฐ๋ณต์๋ ๋ณ๋ ฌ ์์ ์ ํ ์ ์๋๋ก ๋์์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ผ๋ก ์์๋ฅผ ๋ฐ๋ณต์ํฌ ์ ์๋ค. ์คํธ๋ฆผ์ ์ด์ฉํ๋ฉด ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง์ง๋ง, ์์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ Collecton ๋ด๋ถ์์ ์ฒ๋ฆฌ๋๋๊ฒ์ด ๋ ์ข์ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณ๋ ฌ์ฒ๋ฆฌ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์คํธ๋ฆผ์ ์ค๊ฐ ์ฒ๋ฆฌ์ ์ต์ข ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
์ค๊ฐ ์ฒ๋ฆฌ : ๋งคํ, ํํฐ๋ง, ์ ๋ ฌ
์ต์ข ์ฒ๋ฆฌ : ๋ฐ๋ณต, ์นด์ดํ , ํ๊ท , ์ดํฉ ๋ฑ์ ์ง๊ณ ์ฒ๋ฆฌ
BaseStream
์ธํฐํ์ด์ค์๋ ๋ชจ๋ ์คํธ๋ฆผ์์ ์ฌ์ฉํ ์ ์๋ ๊ณตํต ๋ฉ์๋๋ค์ด ์ ์ ๋์ด์์ผ๋ฉฐ, ์ง์ ์ฌ์ฉ๋์ง๋ ์๋๋ค.
๋ฆฌํด ํ์ | ๋ฉ์๋ | ์์ค |
---|---|---|
Stream<T> | java.util.Collection.stream() java.util.Collection.parallelStream() | Collection |
Stream<T> IntStream LongStream DoubleStream | Arrays.stream(T[]) Stream.of(T[]) Arrays.stream(int[]) IntStream.of(int[]) Arrays.stream(long[]) LongStream.of(long[]) Arrays.stream(double[]) DoubleStream.of(double[]) | ๋ฐฐ์ด |
IntStream | IntStream.range(int, int) IntStream.rangeClosed(int, int) | int ๋ฒ์ |
LongStream | LongStream.range(long, long) LongStream.rangeClosed(long, long) | long ๋ฒ์ |
Stream<Path> | Files.find(Path, int, BiPredicate, FileVisitOption) Files.list(Path) | ๋๋ ํ ๋ฆฌ |
Stream<String> | Files.lines(Path, Charset) Files.list(Path) | ํ์ผ |
DoubleStream IntStream LongStream | Random.doubles() Random.ints() Random.longs() | ๋๋ค์ |
rangeClosed๋ ๋๋ฒ์งธ ์ธ์๋ฅผ ํฌํจํ๋ฉฐ, range๋ ๋๋ฒ์งธ ์ธ์๋ฅผ ํฌํจํ์ง ์๋๋ค.
๋๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด ์ถ์ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก Reduction
์ด๋ผ๊ณ ํ๋ค. ๋ฐ์ดํฐ์ ํฉ๊ณ, ํ๊ท ๊ฐ, ์นด์ดํ
, ์ต๋, ์ต์๊ฐ ๋ฑ์ด ๋ํ์ ์ธ ๋ฆฌ๋์
์ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ด๋ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋ฐ๋ก ์ง๊ณํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ค๊ฐ์ฒ๋ฆฌ(ํํฐ๋ง, ๋งคํ, ์ ๋ ฌ, ๊ทธ๋ฃนํ)์ด ํ์ํ๋ค.
ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌ๊ฐ์ ์คํธ๋ฆผ์ด ์ฐ๊ฒฐ๋์ด ์๋ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ฉฐ, ์ต์ข ์ฒ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ค๊ฐ ์ฒ๋ฆฌ ์คํธ๋ฆผ์ด๋ค.
์ค๊ฐ ์คํธ๋ฆผ์ด ์์ฑ๋ ๋ ์์๋ค์ด ๋ฐ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ด ์๋, ์ต์ข ์ฒ๋ฆฌ๊ฐ ์์๋๊ธฐ ์ ๊น์ง ์ค๊ฐ์ฒ๋ฆฌ๋ ์ง์ฐ(lazy)๋๋ฉฐ, ์ต์ข ์ฒ๋ฆฌ๊ฐ ์์๋๋ฉด ์ค๊ฐ ์คํธ๋ฆผ์์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
Java Platform SE8 ์์ ์ค๊ฐ์ฒ๋ฆฌ, ์ต์ ์ฒ๋ฆฌ ๊ด๋ จ ๋ฉ์๋ ์์๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
๋ฆฌํดํ์
์ด ์คํธ๋ฆผ์ด๋ผ๋ฉด ์ค๊ฐ ์ฒ๋ฆฌ ๋ฉ์๋์ด๊ณ , ๊ธฐ๋ณธํ์
์ด๊ฑฐ๋ OptionalXXX
๋ผ๋ฉด ์ต์ข
์ฒ๋ฆฌ ๋ฉ์๋์ด๋ค.
Optional
ํด๋์ค๋ ์ ์ฅํ๋ ๊ฐ์ ํ์
๋ง ๋ค๋ฅผ ๋ฟ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ฑฐ์ ๋์ผํ๋ค. Optional
ํด๋์ค๋ ๋จ์ํ ์ง๊ณ ๊ฐ๋ง ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, ์ง๊ณ ๊ฐ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ํดํธ ๊ฐ์ ์ค์ ํ ์ ์๊ณ , ์ง๊ณ ๊ฐ์ ์ฒ๋ฆฌํ๋ Consumer
๋ ๋ฑ๋กํ ์ ์๋ค.
๋ฆฌํดํ์ | ๋ฉ์๋(๋งค๊ฐ ๋ณ์) | ์ค๋ช |
---|---|---|
boolean | isPresent() | ๊ฐ์ด ์ ์ฅ๋์ด ์๋์ง ์ฌ๋ถ |
T double int long | orElse(T) orElse(double) orElse(int) orElse(long) | ๊ฐ์ด ์ ์ฅ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ํดํธ ๊ฐ ์ง์ |
void | ifPresent(Consumer) ifPresent(DoubleConsumer) ifPresent(IntConsumer) ifPresent(LongConsumer) | ๊ฐ์ด ์ ์ฅ๋์ด ์์ ๊ฒฝ์ฐ Consumer์์ ์ฒ๋ฆฌ |
reduce๋ ์คํธ๋ฆผ์ ๋ชจ๋ ์์๋ค์ ํ๋์ ๊ฒฐ๊ณผ๋ก ํฉ์น๋ค.
์ธํฐํ์ด์ค | ๋ฆฌํด ํ์ | ๋ฉ์๋(๋งค๊ฐ ๋ณ์) |
---|---|---|
Stream | Optional<T> | reduce(BinaryOperator<T> accumulator) |
T | reduce(T identity, BinaryOperator<T> accumulator) | |
IntStream | OptionalInt | reduce(IntBinaryOperator op) |
int | reduce(int identity, IntBinaryOperator op) | |
LongStream | OptionalLong | reduce(LongBinaryOperator op) |
long | reduce(long identity, LongBinaryOperator op) | |
DoubleStream | OptionalDouble | reduce(DoubleBinaryOperator op) |
double | reduce(double identity, DoubleBinaryOperator op) |
ํ์๋ค์ ์ฑ์ ์ด์ ์ ๊ตฌํ๋ ์์์ด๋ค. ์ฌ๊ธฐ์ ์คํธ๋ฆผ์ ์์๊ฐ ์์ ๊ฒฝ์ฐ์ NoSuchElementException
์ด ๋ฐ์ํ๋ค.
identity(๋ํดํธ ๊ฐ)์ ์ฃผ์ด, ์คํธ๋ฆผ์ ์์๊ฐ ์์ ๊ฒฝ์ฐ์๋ 0์ ๋ฆฌํดํ๋ ์์์ด๋ค.
๋ค์์ 3๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์์์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์ด๋ป๊ฒ ์คํ๋๋์ง ํ์ธํ ์ ์๋ค.
collect ๋ฉ์๋๋ ํ์ํ ์์๋ง Collection
์ผ๋ก ๋ด์ ์ ์๊ณ , ์์๋ค์ ๊ทธ๋ฃนํํ ํ ์ง๊ณํ ์ ์๋ค.
๋ฆฌํดํ์ | ๋ฉ์๋(๋งค๊ฐ ๋ณ์) | ์ธํฐํ์ด์ค |
---|---|---|
R | collect(Collector<T,A,R> collertor) | Stream |
๋งค๊ฐ๊ฐ์ธ Collector๋ ์ด๋ค ์์๋ฅผ ์ด๋ค Collection์ ์์งํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. Collectors ๊ตฌํ ๊ฐ์ฒด๋ ์๋ Collectors ํด๋์ค์ ๋ค์ํ ์ ์ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ป์ ์ ์๋ค.
๋ฆฌํด ํ์ | ์ ์ ๋ฉ์๋ | ์ค๋ช |
---|---|---|
Collector<T, ?, List<T>> | toList() | T๋ฅผ List์ ์ ์ฅ |
Collector<T, ?, Set<T>> | toSet() | T๋ฅผ Set์ ์ ์ฅ |
Collector<T, ?, Collection<T>> | toCollection(Supplier<Collection<T>>) | T๋ฅผ Supplier๊ฐ ์ ๊ณตํ Collection์ ์ ์ฅ |
Collertor<T, ?, Map<K,U>> | toMap( Function<T,K> keyMapper, Function<T,U> valueMapper) | T๋ฅผ K์ U๋ก ๋งคํํด K๋ฅผ ํค๋ก, U๋ฅผ ๊ฐ์ผ๋ก Map์ ์ ์ฅ |
Collector<T, ?, ConcurrentMap<K,U>> | toConcurrentMap( Function<T,K> keyMapper, Function<T,U> valueMapper) | T๋ฅผ K์ U๋ก ๋งคํํด K๋ฅผ ํค๋ก, U๋ฅผ ๊ฐ์ผ๋ก ConcurrentMap์ ์ ์ฅ |
๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
collect๋ ๋จ์ํ ์์๋ฅผ ์์งํ๋ ๊ธฐ๋ฅ ์ธ์ Collection์ ์์๋ฅผ ๊ทธ๋ฃนํํด์ Map ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
๋ฆฌํด ํ์ | ์ ์ ๋ฉ์๋ | ์ค๋ช |
---|---|---|
Collertor<T, ?, Map<K,List<T>>> | groupingBy(Function<T,K> classfier) | T๋ฅผ K๋ก ๋งคํํ๊ณ Kํค์ ์ ์ฅ๋ List์ T๋ฅผ ์ ์ฅํ Map ์์ฑ |
Collertor<T, ?, ConcurrentMap<K,List<T>>> | groupingByConcurrent(Function<T,K> classfier) | |
Collertor<T, ?, Map<K, D>> | groupingBy( Function<T,K> classfier, Collector<T,A,D> collector) | T๋ฅผ K์ ๋งคํํ๊ณ Kํค์ ์ ์ฅ๋ D๊ฐ์ฒด์ T๋ฅผ ๋์ ํ Map ์์ฑ |
Collertor<T, ?, ConcurrentMap<K, D>> | groupingByConcurrent( Function<T,K> classfier, Collector<T,A,D> collector) | |
Collertor<T, ?, Map<K, D>> | groupingBy( Function<T,K> classfier, Supplier<Map<K,D>> mapFactory, Collector<T,A,D> collector) | T๋ฅผ K๋ก ๋งคํํ๊ณ Supplier๊ฐ ์ ๊ณตํ๋ Map์์ Kํค์ ์ ์ฅ๋ D๊ฐ์ฒด์ T๋ฅผ ๋์ |
Collertor<T, ?, ConcurrentMap<K, D>> | groupingBy( Function<T,K> classfier, Supplier<ConcurrentMap<K,D>> mapFactory, Collector<T,A,D> collector) |
๋ค์ ์์ ๋ ์ฑ์ ๋ณ๋ก ํด๋น Student List๋ฅผ ๊ตฌํ ์ ์๋ค.
๋ค์์ ์ฑ๋ณ๋ก ํ๊ท ์ ์๋ฅผ ์ ์ฅํ Map์ ๊ตฌํํ ์์ ์ด๋ค. ์์ ์์ ์ฒ๋ผ ๊ทธ๋ฃนํ ํ์ ๋งคํ์ด๋ ์ง๊ณ(ํ๊ท , ์นด์ดํ , ์ฐ๊ฒฐ, ์ต๋, ์ต์, ํฉ๊ณ)๋ฅผ ํ ์ ์๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ๋ฉํฐ ์ฝ์ด CPU ํ๊ฒฝ์์ ํ๋์ ์์ ์ ๋ถํ ํด์ ๊ฐ๊ฐ์ ์ฝ์ด๊ฐ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ฉฐ, ์์ ์ฒ๋ฆฌ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉํ๋ค. Java8๋ถํฐ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ ๊ณตํ๊ณ ์๋ค.
๋ฉํฐ ์ฐ๋ ๋๋ ๋์์ฑ(Concurrency)์ ๋ณ๋ ฌ์ฑ(Parallelism)์ผ๋ก ์คํ๋๊ณ ์๋ค.
๋์์ฑ : ๋ฉํฐ ์ค๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํ๋ ์ฑ์ง
๋ณ๋ ฌ์ฑ : ๋ฉํฐ ์ฝ์ด๋ฅผ ์ด์ฉํด ๋์์ ์คํํ๋ ์ฑ์ง
๋ฐ์ดํฐ ๋ณ๋ ฌ์ฑ : ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ด ์๋ธ ๋ฐ์ดํฐ๋ค๋ก ๋ง๋ค๊ณ ์ด ๋ฐ์ดํฐ๋ค์ ๋ณ๋ ฌ ์ฒ๋ฆฌํด ์์ ์ ๋นจ๋ฆฌ ๋๋ด๋ ๊ฒ(parallelStream)
์์ ๋ณ๋ ฌ์ฑ : ์๋ก ๋ค๋ฅธ ์์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ๊ฒ(Web Server : ๊ฐ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญํ ๋ด์ฉ์ ๊ฐ๋ณ ์ค๋ ๋์์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ)
์ฑ๊ธ ์ฝ์ด CPU๋ฅผ ์ด์ฉํ ๋ฉํฐ ์์ ์ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํ๋ ๋์์ฑ ์์ ์ด๋ค.