# JAVA Stream
Java 8๋ฒ์ ์ด์๋ถํฐ๋ Stream API๋ฅผ ์ง์ํ๋ค
์๋ฐ์์๋ 8๋ฒ์ ์ด์๋ถํฐ ๋๋ค๋ฅผ ์ฌ์ฉํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํด์ก๋ค.
๊ธฐ์กด์ ์กด์ฌํ๋ Collection๊ณผ Stream์ ๋ฌด์จ ์ฐจ์ด๊ฐ ์์๊น? ๋ฐ๋ก **'๋ฐ์ดํฐ ๊ณ์ฐ ์์ '**์ด๋ค.
# Collection
- ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ๋ค. ๋ฐ๋ผ์ Collection์ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ณ์ฐ์ด ์๋ฃ๋์ด์์ด์ผ ํ๋ค.
- ์ธ๋ถ ๋ฐ๋ณต์ ํตํด ์ฌ์ฉ์๊ฐ ์ง์ ๋ฐ๋ณต ์์ ์ ๊ฑฐ์ณ ์์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค(for-each)
# Stream
- ์์ฒญํ ๋๋ง ์์๋ฅผ ๊ณ์ฐํ๋ค. ๋ด๋ถ ๋ฐ๋ณต์ ์ฌ์ฉํ๋ฏ๋ก, ์ถ์ถ ์์๋ง ์ ์ธํด์ฃผ๋ฉด ์์์ ๋ฐ๋ณต ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
- ์คํธ๋ฆผ์ ์์๋ฅผ ๋ฐ๋ก ์ถ๊ฐ ํน์ ์ ๊ฑฐํ๋ ์์ ์ ๋ถ๊ฐ๋ฅํ๋ค.
Collection์ ํธ๋ํฐ์ ์์ ํ์ผ์ ๋ฏธ๋ฆฌ ์ ์ฅํ์ฌ ์ฌ์ํ๋ ํ๋ ์ด์ด๋ผ๋ฉด, Stream์ ํ์ํ ๋ ๊ฒ์ํด์ ๋ฃ๋ ๋ฉ๋ก ๊ณผ ๊ฐ์ ์์ ์ดํ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
# ์ธ๋ถ ๋ฐ๋ณต & ๋ด๋ถ ๋ฐ๋ณต
Collection์ ์ธ๋ถ ๋ฐ๋ณต, Stream์ ๋ด๋ถ ๋ฐ๋ณต์ด๋ผ๊ณ ํ๋ค. ๋ ์ฐจ์ด๋ฅผ ์์๋ณด์.
**์ฑ๋ฅ ๋ฉด์์๋ '๋ด๋ถ ๋ฐ๋ณต'**์ด ๋น๊ต์ ์ข๋ค. ๋ด๋ถ ๋ฐ๋ณต์ ์์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ฉด์ ์ต์ ํ๋ ์์๋ก ์ฒ๋ฆฌํด์ค๋ค. ํ์ง๋ง ์ธ๋ถ ๋ฐ๋ณต์ ๋ช ์์ ์ผ๋ก ์ปฌ๋ ์ ํญ๋ชฉ์ ํ๋์ฉ ๊ฐ์ ธ์์ ์ฒ๋ฆฌํด์ผํ๊ธฐ ๋๋ฌธ์ ์ต์ ํ์ ๋ถ๋ฆฌํ๋ค.
์ฆ, Collection์์ ๋ณ๋ ฌ์ฑ์ ์ด์ฉํ๋ ค๋ฉด ์ง์ synchronized
๋ฅผ ํตํด ๊ด๋ฆฌํด์ผ๋ง ํ๋ค.
# Stream ์ฐ์ฐ
์คํธ๋ฆผ์ ์ฐ์ฐ ๊ณผ์ ์ด '์ค๊ฐ'๊ณผ '์ต์ข '์ผ๋ก ๋๋์ด์ง๋ค.
filter, map, limit
๋ฑ ํ์ดํ๋ผ์ด๋์ด ๊ฐ๋ฅํ ์ฐ์ฐ์ ์ค๊ฐ ์ฐ์ฐ, count, collect
๋ฑ ์คํธ๋ฆผ์ ๋ซ๋ ์ฐ์ฐ์ ์ต์ข
์ฐ์ฐ์ด๋ผ๊ณ ํ๋ค.
๋๋ก ๋๋๋ ์ด์ ๋, ์ค๊ฐ ์ฐ์ฐ๋ค์ ์คํธ๋ฆผ์ ๋ฐํํด์ผ ํ๋๋ฐ, ๋ชจ๋ ํ๊บผ๋ฒ์ ๋ณํฉํ์ฌ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ๋ค์ ์ต์ข ์ฐ์ฐ์์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
ex) Item ์ค์ ๊ฐ๊ฒฉ์ด 1000 ์ด์์ธ ์ด๋ฆ์ 5๊ฐ ์ ํํ๋ค.
List<String> items = item.stream()
.filter(d->d.getPrices()>=1000)
.map(d->d.getName())
.limit(5)
.collect(tpList());
filter์ map์ ๋ค๋ฅธ ์ฐ์ฐ์ด์ง๋ง, ํ ๊ณผ์ ์ผ๋ก ๋ณํฉ๋๋ค.
๋ง์ฝ Collection ์ด์๋ค๋ฉด, ์ฐ์ ๊ฐ๊ฒฉ์ด 1000 ์ด์์ธ ์์ดํ ์ ์ฐพ์ ๋ค์, ์ด๋ฆ๋ง ๋ฐ๋ก ์ ์ฅํ ๋ค 5๊ฐ๋ฅผ ์ ํํด์ผ ํ๋ค. ์ฐ์ฐ ์ต์ ํ๋ ๋ฌผ๋ก , ๊ฐ๋ ์ฑ ๋ฉด์์๋ Stream์ด ๋ ์ข๋ค.
# Stream ์ค๊ฐ ์ฐ์ฐ
- filter(Predicate) : Predicate๋ฅผ ์ธ์๋ก ๋ฐ์ true์ธ ์์๋ฅผ ํฌํจํ ์คํธ๋ฆผ ๋ฐํ
- distinct() : ์ค๋ณต ํํฐ๋ง
- limit(n) : ์ฃผ์ด์ง ์ฌ์ด์ฆ ์ดํ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์คํธ๋ฆผ ๋ฐํ
- skip(n) : ์ฒ์ ์์ n๊ฐ ์ ์ธํ ์คํธ๋ฆผ ๋ฐํ
- map(Function) : ๋งคํ ํจ์์ result๋ก ๊ตฌ์ฑ๋ ์คํธ๋ฆผ ๋ฐํ
- flatMap() : ์คํธ๋ฆผ์ ์ฝํ ์ธ ๋ก ๋งคํํจ. map๊ณผ ๋ฌ๋ฆฌ ํ๋ฉดํ๋ ์คํธ๋ฆผ ๋ฐํ
์ค๊ฐ ์ฐ์ฐ์ ๋ชจ๋ ์คํธ๋ฆผ์ ๋ฐํํ๋ค.
# Stream ์ต์ข ์ฐ์ฐ
- (boolean) allMatch(Predicate) : ๋ชจ๋ ์คํธ๋ฆผ ์์๊ฐ Predicate์ ์ผ์นํ๋์ง ๊ฒ์ฌ
- (boolean) anyMatch(Predicate) : ํ๋๋ผ๋ ์ผ์นํ๋ ์์๊ฐ ์๋์ง ๊ฒ์ฌ
- (boolean) noneMatch(Predicate) : ๋งค์น๋๋ ์์๊ฐ ์๋์ง ๊ฒ์ฌ
- (Optional) findAny() : ํ์ฌ ์คํธ๋ฆผ์์ ์์์ ์์ ๋ฐํ
- (Optional) findFirst() : ์คํธ๋ฆผ์ ์ฒซ๋ฒ์งธ ์์
- reduce() : ๋ชจ๋ ์คํธ๋ฆผ ์์๋ฅผ ์ฒ๋ฆฌํด ๊ฐ์ ๋์ถ. ๋ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง
- collect() : ์คํธ๋ฆผ์ reduceํ์ฌ list, map, ์ ์ ํ์ ์ปฌ๋ ์ ์ ๋ง๋ฌ
- (void) forEach() : ์คํธ๋ฆผ ๊ฐ ์์๋ฅผ ์๋นํ๋ฉฐ ๋๋ค ์ ์ฉ
- (Long) count : ์คํธ๋ฆผ ์์ ๊ฐ์ ๋ฐํ
# Optional ํด๋์ค
๊ฐ์ ์กด์ฌ๋ ์ฌ๋ถ๋ฅผ ํํํ๋ ์ปจํ ์ด๋ Class
- null๋ก ์ธํ ๋ฒ๊ทธ๋ฅผ ๋ง์ ์ ์๋ ์ฅ์ ์ด ์๋ค.
- isPresent() : Optional์ด ๊ฐ์ ํฌํจํ ๋ True ๋ฐํ
# Stream ํ์ฉ ์์
map()
List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung"); names.stream() .map(name -> name.toUpperCase()) .forEach(name -> System.out.println(name));
filter()
List<String> startsWithN = names.stream() .filter(name -> name.startsWith("S")) .collect(Collectors.toList());
reduce()
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Optional<Integer> sum = numbers.reduce((x, y) -> x + y); sum.ifPresent(s -> System.out.println("sum: " + s));
sum : 55
collect()
System.out.println(names.stream() .map(String::toUpperCase) .collect(Collectors.joining(", ")));
# [์ฐธ๊ณ ์๋ฃ]
โ - Error & Exception - Record โ