Bibi's DevLog ๐ค๐
[Java] ์คํธ๋ฆผ, ์คํธ๋ฆผ์ ์ฐ์ฐ, Optional ๋ณธ๋ฌธ
[Java] ์คํธ๋ฆผ, ์คํธ๋ฆผ์ ์ฐ์ฐ, Optional
๋น๋น bibi 2021. 2. 23. 23:19์คํธ๋ฆผ Stream
์คํธ๋ฆผ์ด๋?
: ๋ฐฐ์ด, ์ปฌ๋ ์ , ํ์ผ ๋ฑ ์ธ์คํด์ค์ ์ ์ฅ ์์๋ฅผ ์ฝ๊ฒ ์ฐธ์กฐํ๊ฒ ํด ์ฃผ๋ ๋ฐ๋ณต์. (์ถ์ฒ)
๋ฐ์ดํฐ ์์ค๋ฅผ ์ถ์ํํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ค์ ์ ์ํด ๋์.
'๋ฐ์ดํฐ ์์ค์ ์ถ์ํ'์ ์๋ฏธ?
: ๋ฐ์ดํฐ ์์ค(๋ฐฐ์ด/์ปฌ๋ ์ /ํ์ผ ..)๊ฐ ๋ฌด์์ด๋ ๊ฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์๋ค.
: ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค.
// String[] ๊ณผ List<String>์ด๋ผ๋ ๋ ๋ฐ์ดํฐ์์ค
String[] strArr = {"aaa", "bbb", "ccc"};
List<String> strList = Arrays.asList(strArr);
// Stream ์์ฑ
Stream<String> strStream1 = Arrays.stream(strArr);
Stream<String> strStream2 = strList.stream();
// Stream์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ ๋ ฌํ์ฌ ํ๋ฉด์ ์ถ๋ ฅ (*๋ฐ์ดํฐ ์์ค๊ฐ ์ ๋ ฌ๋๋ ๊ฒ์ ์๋๋ค)
strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);
// Stream์์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ ๋ ฌํ์ฌ ํ๋ฉด์ ์ถ๋ ฅํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํด์ผ ํ๋ค (*๋ฐ์ดํฐ ์์ค๊ฐ ์ ๋ ฌ๋๋ค)
Arrays.sort(strArr);
Collections.sort(strList);
for(String str : strArr)
System.out.println(str);
for(String str : strList)
System.out.println(str);
*System.out::println
์ System.out.println()
์ ๋ฉ์๋ ์ฐธ์กฐ์. ๋๋ค์์ผ๋ก๋ (str) -> System.out.println(Str)
์คํธ๋ฆผ์ ํน์ฅ์
์คํธ๋ฆผ์ ์ฌ์ฉํ ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ ์ฝ๋๊ฐ ์ฌ์ฌ์ฉ์ฑ์ด ๋ ๋๋ค. (<-๋ฐ์ดํฐ ์์ค์ ์ถ์ํ)
์คํธ๋ฆผ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ์คํธ๋ฆผ์ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ ๋ฟ, ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์คํธ๋ฆผ์ ์ผํ์ฉ์ด๋ค.
- Iterator์ฒ๋ผ ์ผํ์ฉ์ด๋ฏ๋ก, ํ๋ฒ ์ฌ์ฉํ๋ฉด ๋ซํ๊ณ ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
์คํธ๋ฆผ์ ์์ ์ ๋ด๋ถ ๋ฐ๋ณต์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ด๋ถ ๋ฐ๋ณต : ๋ฐ๋ณต๋ฌธ์ ๋ฉ์๋์ ๋ด๋ถ์ ์จ๊ธธ ์ ์๋ค๋ ์๋ฏธ.
forEach()
: ์คํธ๋ฆผ ๋ฉ์๋์ ํ๋. ๋งค๊ฐ๋ณ์์ ๋์ ๋ ๋๋ค์์ ๋ฐ์ดํฐ์์ค์ ๋ชจ๋ ์์์ ์ ์ฉํ๋ค.๋ฉ์๋ ์์ผ๋ก for๋ฌธ์ ๋ฃ์ ๊ฒ๊ณผ ๊ฐ๋ค. ์ํํ ์์ ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
์คํธ๋ฆผ์ด ์ ๊ณตํ๋ ๋ค์ํ ์ฐ์ฐ์ ํตํด ๋ณต์กํ ์์ ์ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.
(์๋ '์คํธ๋ฆผ์ ์ฐ์ฐ' ์ฐธ๊ณ )์์์ ํ์ ์ด T์ธ ์คํธ๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก
Stream<T>
์ด์ง๋ง,
์คํ ๋ฐ์ฑ ๋ฐ ์ธ๋ฐ์ฑ์ผ๋ก ์ธํ ๋นํจ์จ์ ์ค์ด๊ธฐ ์ํด ๋ฐ์ดํฐ์์ค์ ์์๋ฅผ ๊ธฐ๋ณธํ์ผ๋ก ๋ค๋ฃจ๋IntStream
,LongStream
,DoubleStream
์คํธ๋ฆผ์ด ์ ๊ณต๋๋ค.- ์ผ๋ฐ์ ์ผ๋ก
Stream<Integer>
๋ณด๋คIntStream
์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ด๋ค. - ๊ฐ ๊ธฐ๋ณธํ์ ๊ฐ์ผ๋ก ์์ ํ ๋ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก
์คํธ๋ฆผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ฉด ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ฌ์์ง๋ค. (๋ณ๋ ฌ ์คํธ๋ฆผ)
- ์คํธ๋ฆผ์ ์์ ์ ๋ณ๋ ฌ์ฒ๋ฆฌํ๋ fork&join ํ๋ ์์ํฌ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํด ์๋์ผ๋ก ์ฐ์ฐ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ค.
parallel()
: ์คํธ๋ฆผ์ ์์ฑ์ ๋ณ๋ ฌ ์คํธ๋ฆผ์ผ๋ก ๋ณ๊ฒฝํจ (๋ณ๋ ฌ๋ก ์ฐ์ฐ์ ์ํํ๋๋ก ํจ)sequential()
:parallel()
๋ก ์ค์ ๋ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ๋ ์ด์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋์ง ์๊ฒ ํจ
(๋ชจ๋ ์คํธ๋ฆผ์ ๊ธฐ๋ณธ๊ฐ)
์คํธ๋ฆผ ๋ง๋ค๊ธฐ
๊ฐ์ฅ ๋จผ์ ์คํธ๋ฆผ์ ์์ฑํด์ผ ์คํธ๋ฆผ์ ํตํด ์์ ํ ์ ์๋ค.
์คํธ๋ฆผ์ ๋ฐ์ดํฐ์์ค
: ๋ฐฐ์ด, ์ปฌ๋ ์ , ์์์ ์ ๋ฑ ๋ค์ํ๋ค.
์ปฌ๋ ์
: ์ปฌ๋ ์ ์ ์กฐ์์ธ Collection์
stream()
์ด ์ ์๋์ด ์๋ค.Collection์ ์์ List ๋๋ Set๋ฅผ ๊ตฌํํ ์ปฌ๋ ์ ํด๋์ค๋ค์ ๋ชจ๋
stream()
์ผ๋ก ์คํธ๋ฆผ์ ์์ฑํ ์ ์๋ค.stream()
: ํด๋น ์ปฌ๋ ์ ์ ์์คsource๋ก ํ๋ ์คํธ๋ฆผ์ ๋ฐํํ๋คList<Integer> list = ArrayList.asList(1,2,3); Stream<Integer> intStream = list.stream(); // list๋ฅผ ์์ค๋ก ํ๋ ์ปฌ๋ ์ ์์ฑ
๋ฐฐ์ด
: ๋ฐฐ์ด์ ์์ค๋ก ์คํธ๋ฆผ์ ๋ง๋๋ ๋ฉ์๋๋ Stream๊ณผ Arrays์ static๋ฉ์๋๋ก ์ ์๋์ด ์๋ค.Stream.of(T ... values)
,Stream.of(T[])
๋๋
Arrays.stream(T[])
,Arrays.stream(T[] array, int startInclusive, int endExclusive)
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"}); Stream<String> strStream = Arrays.stream(new String[] {"a", "b", "c"});
IntStream.of
(),LongStream.of()
,DoubleStream.of()
๋๋
Arrays.stream(int[])
,Arrays.stream(long[])
,Arrays.stream(double[])
: ๊ธฐ๋ณธํ(
Integer
,Long
,Double
) ๋ฐฐ์ด์ ์์ค๋ก ํ๋ ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฉ์๋
ํน์ ๋ฒ์์ ์ ์
: ์ง์ ๋ ๋ฒ์์ ์ฐ์๋ ์ ์๋ฅผ ์คํธ๋ฆผ์ผ๋ก ์์ฑํด ๋ฐํ
Intstream IntStream.range(int begin, int end)
(end
๋ฅผ ๋ฒ์์ ํฌํจํ์ง ์์)IntStream IntStream.rangeClosed(int begin, int end)
(end
๋ฅผ ๋ฒ์์ ํฌํจ)
์์์ ์
: ๋์๋ฅผ ์์ฑํ๋ Randomํด๋์ค์ ์ ์ธ๋ ๋ฉ์๋๋ค. ํด๋น ํ์ ์ ๋์๋ก ์ด๋ฃจ์ด์ง ์คํธ๋ฆผ์ ๋ฐํ
IntStream ints()
,LongStream longs()
,DoubleStream doubles()
(๋ฌดํ ์คํธ๋ฆผ - ํฌ๊ธฐ๊ฐ ์ ํด์ง์ง ์์)limit(int limit)
: ๋ฌดํ ์คํธ๋ฆผ์ ์ ํ ์คํธ๋ฆผ์ผ๋ก ๋ง๋ค๊ณ , ํฌ๊ธฐ๋ฅผ limit๋ก ์ ํํ๋ ๋ฉ์๋
๋๋ค์
: ๋๋ค์์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋๋ค์์ ์ํด ๊ณ์ฐ๋๋ ๊ฐ๋ค์ ์์๋ก ํ๋ ๋ฌดํ ์คํธ๋ฆผ ์์ฑ
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
:
seed
๋ถํฐ ์์, ๋๋ค์f
์ ์ํด ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์seed
๊ฐ์ผ๋ก ํ์ฌ ๋ฐ๋ณต ๊ณ์ฐstatic <T> Stream<T> generate(Supplier<T> s)
:
iterate()
์ ๋น์ทํ๋ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด ๋ค์ ์์๋ฅผ ๊ณ์ฐํ์ง ์์.
ํ์ผ
:
java.nio.file.Files
์list()
๋ก ์ ์๋จ.Stream<Path> Files.list(Path dir)
: ์ง์ ๋ ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ์ ๋ชฉ๋ก์ ์์ค๋ก ํ๋ ์คํธ๋ฆผ์ ์์ฑํด ๋ฐํ.Stream<String> Files.lines(Path path)
: ํ์ผ์ ํ ํ(line)์ ์์๋ก ํ๋ ์คํธ๋ฆผ ์์ฑ
BufferedReaderํด๋์ค์ ์ํ ๋ฉ์๋ ์ค์๋ ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฉ์๋๊ฐ ์๋ค.
Stream<String> lines()
: ํ์ผ ์ธ์ ๋ค๋ฅธ ๋์์ผ๋ก๋ถํฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋จ์๋ก ์ฝ์ ์ ์๋ค
๋น ์คํธ๋ฆผ
: ์์๊ฐ ํ๋๋ ์๋ ๋น ์คํธ๋ฆผ์ ์์ฑ.
์คํธ๋ฆผ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ ์์ ๋, null ๋์ ๋น ์คํธ๋ฆผ์ ๋ฐํํ๋ค
Stream.empty()
: ๋น ์คํธ๋ฆผ์ ์์ฑํด ๋ฐํํจ
๋ ์คํธ๋ฆผ ์ฐ๊ฒฐ
: ๊ฐ์ ํ์ ์ ์์๋ฅผ ๊ฐ์ง ๋ ์คํธ๋ฆผ์ ํ๋๋ก ์ฐ๊ฒฐํ๋ค
concat(Stream<T> str1, Stream<T> str2)
: ์คํธ๋ฆผ str1, str2๋ฅผ ํ๋๋ก ์ฐ๊ฒฐํจ
์คํธ๋ฆผ์ ์ฐ์ฐ
์ฐ์ฐ operation : ์คํธ๋ฆผ์ ์ ์๋ ๋ฉ์๋ ์ค ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค๋ฃจ๋ ์์ ์ ์ํํ๋ ๊ฒ.
์คํธ๋ฆผ์ ์ฐ์ฐ์๋ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ์ด ์๋ค.
- ์ค๊ฐ ์ฐ์ฐ : ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ๋ฐํํจ. ์ค๊ฐ ์ฐ์ฐ์ ์ฐ์ํด์ ์ฐ๊ฒฐํ ์ ์์.
- ์ต์ข ์ฐ์ฐ : ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ์คํธ๋ฆผ์ด ์๋ ์ฐ์ฐ. ์คํธ๋ฆผ์ ์์๋ฅผ ์๋ชจํ๋ฉด์ ์ฐ์ฐ์ ์ํํ๋ฉฐ ๋ง์ง๋ง์ ํ ๋ฒ๋ง ์ฐ์ฐ์ด ๊ฐ๋ฅํจ.
์คํธ๋ฆผ ์ฐ์ฐ์์๋ ์ต์ข ์ฐ์ฐ์ด ์ํ๋๊ธฐ ์ ์๋ ์ค๊ฐ ์ฐ์ฐ์ด ์ํ๋์ง ์๋๋ค.
์ค๊ฐ์ฐ์ฐ์ ํธ์ถํ ๋๋ ์ฐ์ฐ์ด ์ํ๋์ง ์๋๋ค. ์ด๋ค ์์ ์ ์ํํ ์ง ์ง์ ํ ๊ฒ ๋ฟ์ด๋ค.
์ต์ข ์ฐ์ฐ์ ํธ์ถํ ๋ ์ฐ์ฐ์ด ์ํ๋๋ฉฐ ์คํธ๋ฆผ์ ๊ฐ ์์๋ค์ด ์ค๊ฐ ์์๋ฅผ ๊ฑฐ์ณ ์ต์ข ์ฐ์ฐ์์ ์๋ชจ๋๋ค.
์คํธ๋ฆผ์ ์ค๊ฐ์ฐ์ฐ
์คํธ๋ฆผ ์๋ฅด๊ธฐ
: ์คํธ๋ฆผ์ ์ผ๋ถ๋ฅผ ์๋ผ๋ผ ๋ ์ฌ์ฉ
skip(long n)
: ์คํธ๋ฆผ์ ์ฒ์ n๊ฐ ์์๋ฅผ ๊ฑด๋๋ด๋ค.limit(long maxSize)
: ์คํธ๋ฆผ์ ์์๋ฅผ maxSize๊ฐ๋ก ์ ํํ๋ค.
์คํธ๋ฆผ์ ์์ ๊ฑธ๋ฌ๋ด๊ธฐ
distinct()
: ์คํธ๋ฆผ์์ ์ค๋ณต๋ ์์๋ค์ ์ ๊ฑฐํ๋ค.filter(Predicate<? super T> predicate)
: ์ฃผ์ด์ง ์กฐ๊ฑด predicate์ ๋ง์ง ์๋ ์์๋ฅผ ๊ฑธ๋ฌ๋ธ๋ค.(predicate์๋ ์ฐ์ฐ๊ฒฐ๊ณผ๊ฐ boolean์ธ ๋๋ค์์ ์ฌ์ฉํ ์ ์๋ค)
๋ค๋ฅธ ์กฐ๊ฑด์ผ๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค.
์คํธ๋ฆผ ์ ๋ ฌํ๊ธฐ
sorted()
: ์คํธ๋ฆผ์ ๊ธฐ๋ณธ ์ ๋ ฌ(์ฌ์ ์) ๋ก ์ ๋ ฌํ๋ค.- Comparator ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์ ํ์ฉํ๋ฉด ์ ๋ ฌ์ด ์ฌ์์ง๋ค.
comparing()
๋ฑ.
๋ณํ
: ์คํธ๋ฆผ ์์์ ์ ์ฅ๋ ๊ฐ ์ค์์ ์ํ๋ ํ๋๋ง ๋ฝ๊ฑฐ๋ ํน์ ํํ๋ก ๋ณํํจ.
map()
/mapToInt()
,mapToLong()
,mapToDouble()
/flapMap()
์กฐํ
:
peek()
- ์ฐ์ฐ ์ฌ์ด์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ.- ์ฃผ๋ก
peek(a -> System.out.println(a))
์ ๊ฐ์ด ์ฌ์ฉ
- ์ฃผ๋ก
์คํธ๋ฆผ์ ์ต์ข ์ฐ์ฐ
์ต์ข ์ฐ์ฐ์ ์คํธ๋ฆผ์ ์์๋ฅผ ์๋ชจํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค.
์ต์ข ์ฐ์ฐ ํ์๋ ์คํธ๋ฆผ์ด ๋ซํ๋ฉฐ ๊ทธ ์คํธ๋ฆผ์ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ค.
์ต์ข ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ ๋จ์ผ ๊ฐ / ๋ฐฐ์ด, ์ปฌ๋ ์ ์ผ ์ ์๋ค.
void forEach(action)
: ์คํธ๋ฆผ์ ์์๋ฅผ ์๋ชจํ๋ ์ต์ข ์ฐ์ฐ.forEach(System.out::println)
๊ณผ ๊ฐ์ด ์คํธ๋ฆผ ์์๋ฅผ ์ถ๋ ฅํ ๋ ๋ง์ด ์ฌ์ฉ๋จ.
์กฐ๊ฑด ๊ฒ์ฌ
: ์คํธ๋ฆผ์ ์์์ ๋ํด, ์กฐ๊ฑด๊ณผ ์์๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋๋ค.
๋ชจ๋ ๋งค๊ฐ๋ณ์๋ก Predicate(์กฐ๊ฑด)๋ฅผ ์๊ตฌํ๋ฉฐ, ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก boolean์ ๋ฐํํจ
boolean allMatch(predicate)
: ์กฐ๊ฑด์ ๋ชจ๋ ์์๊ฐ ์ผ์นํ๋์งboolean anyMatch(predicate)
: ์กฐ๊ฑด์ ์ผ๋ถ ์์๊ฐ ์ผ์นํ๋์งboolean noneMatch(predicate)
: ์กฐ๊ฑด์ ์ด๋ค ์์๋ ์ผ์นํ์ง ์๋์งOptional<T> findFirst()
: ์กฐ๊ฑด์ ๋ง๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํ. ์ฃผ๋กfilter()
์ ํจ๊ป ์ฌ์ฉOptional<T> findAny()
: ๋ณ๋ ฌ ์คํธ๋ฆผ์ผ ๋ ์ฌ์ฉ.์กฐ๊ฑด์ ๋ง๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํ. ์ฃผ๋กfilter()
์ ํจ๊ป ์ฌ์ฉ
ํต๊ณ
: ์คํธ๋ฆผ์ ์์๋ค์ ๋ํ ํต๊ณ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๋ฉ์๋๋ค.
๊ธฐ๋ณธํ ์คํธ๋ฆผ(
IntStream
๋ฑ)์์ ๋ ๋ง์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๋ณํํด์ ์ฌ์ฉํ๊ฑฐ๋,reduce()
/collect()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.count()
,sum()
,average()
,max()
,min()
๋ฆฌ๋์ฑ reduce()
: ์คํธ๋ฆผ์ ์์๋ฅผ ์ค์ฌ๋๊ฐ๋ฉด์ ์ฐ์ฐ์ ์ํํ๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ.
์ฒ์ ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ , ๋ค์ ์์์ ์ฐ์ฐ์ ๋ฐ๋ณตํ๋ค.
์คํธ๋ฆผ์ ๋ชจ๋ ์์๋ฅผ ์๋ชจํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ.
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator)
(identity
์ ์ฒซ ์์๋ก ์ฐ์ฐ์ ์์)identity
: ์ด๊ธฐ๊ฐ,BinaryOperator
: ์ฐ์ฐ์ด๊ธฐ๊ฐ์ ์ค์ ํ๊ณ , ์ด๋ค ์ฐ์ฐ์ผ๋ก ์คํธ๋ฆผ์ ์์๋ฅผ ์ค์ฌ๋๊ฐ์ง ๊ฒฐ์ ํ๋ค.
๋ฆฌ๋์ฑ์ ๋ด๋ถ์ ์ผ๋ก ์๋์ ๊ฐ์ด ๋์ํ๋ค.
T reduce(T identity, BinaryOperator<T> accumulator) { T a = identity; for(T b : stream) a = accumulator.apply(a, b); return a; } // ์๋ฅผ ๋ค์ด ๋ชจ๋ ์์๋ฅผ ๋ํ๋ ๊ฒฝ์ฐ int a = identity for(int b : stream) a = a + b;
collect()์ Collector
์คํธ๋ฆผ์ ์ต์ข ์ฐ์ฐ ์ค์์๋ ๊ฐ์ฅ ๋ณต์กํ์ง๋ง ์ ์ฉํ๋ค.
collect() : ์คํธ๋ฆผ์ ์์๋ฅผ ์์งํ๋ ์ต์ข ์ฐ์ฐ. reduce()์ ์ ์ฌํ๋ค.
Object collect(Collector collector)
๋งค๊ฐ๋ณ์๋ก Collector(Collector๋ฅผ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ฒด)๋ฅผ ํ์๋ก ํ๋ค.
collect()๋ ํด๋น ๊ฐ์ฒด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ๋๋ก ์คํธ๋ฆผ์ ์์๋ฅผ ์์งํ๋ค.
Collector ์ปฌ๋ ํฐ : Collector ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ. collect()๋ก ์คํธ๋ฆผ์ ์์๋ฅผ ์ด๋ป๊ฒ ์์งํ ์ง ๊ทธ ๋ฐฉ๋ฒ์ด ์ ์๋์ด ์์.
- ํด๋น ํด๋์ค์ ์ ๊ณต๋๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ง์ Collector์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ์ปฌ๋ ํฐ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
Collectors : ํด๋์ค. static๋ฉ์๋๋ก ๋ฏธ๋ฆฌ ์์ฑ๋ ๋ค์ํ ์ปฌ๋ ํฐ๋ฅผ ๋ฐํํ๋ค. (
Collectors.toList
์ฒ๋ผ ์ฌ์ฉ)์คํธ๋ฆผ์ ์ปฌ๋ ์ /๋ฐฐ์ด๋ก ๋ฐํ
:
toList()
,toSet()
,toMap()
,toCollection()
,toArray()
ํต๊ณ
:
counting()
,summingInt()
,averagintInt()
,maxBy()
,minBy()
๋ฆฌ๋์ฑ
:
reduce()
,reducing()
๋ฌธ์์ด ๊ฒฐํฉ
:
joining()
๋ถ๋ฅ - ๊ทธ๋ฃนํ / ๋ถํ
(๊ทธ๋ฃนํ : ์คํธ๋ฆผ์ ์์๋ฅผ ํน์ ๊ธฐ์ค-Function-์ผ๋ก ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ธฐ)
(๋ถํ : ์คํธ๋ฆผ์ ์์๋ฅผ ์กฐ๊ฑด-Predicate-์ ์ผ์นํ๋ ๊ทธ๋ฃน, ์ผ์นํ์ง ์๋ ๊ทธ๋ฃน 2๊ฐ์ง๋ก ๋๋๊ธฐ)
:
groupingBy()
,partitioningBy()
Optional
Optional<T>
๋ ์ ๋ค๋ฆญ ํด๋์ค๋ก, Tํ์
์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ๋ํผํด๋์ค์ด๋ค. Optional ๊ฐ์ฒด์๋ ๋ชจ๋ ํ์
์ ์ฐธ์กฐ๋ณ์๋ฅผ ๋ด์ ์ ์๋ค.
- ์คํธ๋ฆผ ์ต์ข ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฅ ๋ฐํํ๋ ๋์ Optional๊ฐ์ฒด์ ๋ด์ ๋ฐํํ๋ฉด, Optional์ ์ ์๋ ๋ฉ์๋๋ฅผ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.
- Optional๊ฐ์ฒด์๋ Stream์ฒ๋ผ
filter()
,map()
,flatMap()
์ ์ฌ์ฉํ ์ ์๋ค.
(๊ฐ๋ ๋ง ๊ฐ๋จํ ๊ณต๋ถํ๊ณ ํ์์ ์ฐธ๊ณ ํ๋ฉฐ ๋ณด์ถฉํ๊ฒ ์ต๋๋ค)
Optional ๊ฐ์ฒด ์์ฑ
Optional<T> optional = Optional.of(์ฐธ์กฐ๋ณ์)
: ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ฌ์ฉ (์ฐธ์กฐ๋ณ์๊ฐ null์ผ ๋ NullPointerException ๋ฐ์)Optional<T> optional = Optilnal.ofNullable(์ฐธ์กฐ๋ณ์)
: ์ฐธ์กฐ๋ณ์์ ๊ฐ์ด null์ผ ๊ฐ๋ฅ์ฑ์ด ์์ ๋ ์ฌ์ฉOptional<T> optional = Optional.empty()
: ์ฐธ์กฐ๋ณ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํํจ
Optional ๊ฐ์ฒด์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
get()
orElse()
,orElseGet()
,orElseThrow()
isPresent()
,ifPresent()
'๐ฅ BE ๋ฐฑ์๋ > Java ์๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ ์์์ ์์ ์ปจ๋ฒค์ / System.exit(0) (0) | 2021.03.02 |
---|---|
[Java] ๊ฐํ๋ฌธ์, System.getProperty("line.separator") (1) | 2021.02.25 |
[Java] ๋๋ค์, ํจ์ํ ์ธํฐํ์ด์ค (0) | 2021.02.23 |
[Java] StringBuffer, StringBuilder ๊ทธ๋ฆฌ๊ณ String / StringBuffer ๊ฐ๋ ๊ณผ ์ฌ์ฉ / Buffer์ ๊ฐ๋ (0) | 2021.02.22 |
[Java] try-with-resources ๊ฐ๋ ๊ณผ ์ฌ์ฉ๋ฒ (0) | 2021.02.22 |