Java 8๋ถํฐ ์ง์ํ๋ ๊ธฐ๋ฅ
์ปฌ๋ ์
, ๋ฐฐ์ด ๋ฑ์ ๋ํด ์ ์ฅ๋์ด ์๋ ์์๋ค์ ํ๋์ฉ ์ฐธ์กฐํ์ฌ ๋ฐ๋ณต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ฅ
๋ถํ์ํ for๋ฌธ๊ณผ ๊ทธ ์์์ ๋์ํ๋ if๋ฌธ ๋ฑ์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๊ณ ๊น๋ํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ก ๊ตฌํํ ์ ์์
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์
Stream์ ์๋ณธ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ ๋ฟ, ์๋ณธ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์
์ผํ์ฉ์ด๋ค.
Stream์ ํ ๋ฒ ์ฌ์ฉํ๋ฉด ๋ซํ์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํจ
ํ์ํ๋ค๋ฉด ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ์
์ด๋ ๋ฐฐ์ด์ ๋ด์ ๋ฐํํ ์ ์์
์์
์ ๋ด๋ถ ๋ฐ๋ณต์ผ๋ก ์ฒ๋ฆฌ ํจ
๋ด๋ถ ๋ฐ๋ณต์ ๋ฐ๋ณต๋ฌธ์ ๋ฉ์๋์ ๋ด๋ถ์ ์จ๊ธธ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธ
์ฆ, ๋ฐ๋ณต๋ฌธ์ด ์ฝ๋ ์์ ๋
ธ์ถ๋์ง ์์
Stream์ ์ธ ๊ฐ์ง ๊ตฌ์กฐ
Stream ์์ฑ
์ค๊ฐ ์ฐ์ฐ
์ต์ข
์ฐ์ฐ
๋ฐ์ดํฐ ์์ค ๊ฐ์ฒด ์งํฉ.Stream์์ฑ().์ค๊ฐ์ฐ์ฐ().์ต์ข
์ฐ์ฐ() ;
์์ ์ฝ๋
String [] strArray = {"red" , "yellow" , "blue" , "green" , "brown" };
Set <String > colorSet = Arrays .asList (strArray ) // strArray๋ฅผ List๋ก ๋ณํ
.stream () // 1. Stream ์์ฑ
.filter (x -> x .contains ("b" )) // 2. ์ค๊ฐ ์ฐ์ฐ : "b"๊ฐ ํฌํจ๋ ๋จ์ด๋ง
.collect (Collectors .toSet ()); // 3. ์ต์ข
์ฐ์ฐ : ์ค๊ฐ ์ฐ์ฐ์ ํตํด ๊ฐ๊ณต๋ stream์ Set ํํ๋ก ๋ชจ์์ค
colorSet .forEach (x -> System .out .println (x )); // ์ถ๋ ฅ: blue brown
Stream ์ฌ์ฉ ๊ฐ๋ฅ ๋ฐ์ดํฐ์์ค
์ปฌ๋ ์
๋ฐฐ์ด
๊ฐ๋ณ ๋งค๊ฐ๋ณ์
์ง์ ๋ ๋ฒ์์ ์ฐ์๋ ์ ์
ํน์ ํ์
์ ๋์๋ค
๋๋ค ํํ์
ํ์ผ
๋น ์คํธ๋ฆผ
๋ํ์ ์ธ ์ค๊ฐ ์ฐ์ฐ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๋ฉ์๋
Stream ํํฐ๋ง: filter() , distinct()
Stream ๋ณํ: map() , flatMap()
map(): ๋จ์ผ ์คํธ๋ฆผ ์์ ์์๋ฅผ ์ํ๋ ํน์ ํํ๋ก ๋ณํ
flatMap(): ์คํธ๋ฆผ ์์ ๋ชจ๋ ์์๋ฅผ ๋จ์ผ ์์ ์คํธ๋ฆผ ์ผ๋ก ๋ณํ
Stream ์ ํ: limit() , skip()
Stream ์ ๋ ฌ: sorted()
Stream ์ฐ์ฐ ๊ฒฐ๊ณผ ํ์ธ: peek()
์ต์ข
์ฐ์ฐ์ ์์ ์ค๊ฐ ์ฐ์ฐ์ ํตํด ๋ง๋ค์ด์ง stream์ ์๋ ์์๋ค์ ๋ํด ๋ง์ง๋ง์ผ๋ก ๊ฐ ์์๋ฅผ ์๋ชจํ๋ฉฐ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ํ์
์ง์ฐ(lazy)๋์๋ ๋ชจ๋ ์ค๊ฐ ์ฐ์ฐ๋ค์ด ์ต์ข
์ฐ์ฐ์์ ๋ชจ๋ ์ํ๋จ
์ต์ข
์ฐ์ฐ ์์ ๋ชจ๋ ์์๋ฅผ ์๋ชจํ ํด๋น stream์ ๋ ์ด์ ์ฌ์ฉํ ์ ์์
๋ํ์ ์ธ ์ต์ข
์ฐ์ฐ
์์์ ์ถ๋ ฅ: forEach()
์์์ ์๋ชจ: reduce()
์์์ ๊ฒ์: findFirst() , findAny()
์์์ ๊ฒ์ฌ: anyMatch() , allMatch() , noneMatch()
์์์ ํต๊ณ: count() , min() , max()
์์์ ์ฐ์ฐ: sum() , average()
์์์ ์์ง: collect()
allMatch() ์ฌ์ฉ ์ ์ฃผ์ํ ์
allMatch()๋ ์ปฌ๋ ์
๋ด ๋ชจ๋ ์์๋ค์ด ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฉ์๋์ด๋ค.
ํ์ง๋ง ๋ง์ฝ ์ปฌ๋ ์
์ด ๋น์ด์๋ ๊ฒฝ์ฐ ๋ผ๋ฉด ์ด๋จ๊น?
@ Test
public void allMatchTestWhenEmpty () {
List <Member > members = new AraryList <>();
boolean result = members .stream ()
.allMatch (member -> member .getAge () > 20 );
assertThat (result ).isFalse ();
}
members ํ์ ๋ฆฌ์คํธ๊ฐ ๋น์ด์๊ณ 20์ด ์ด์์ ํ์์ด ํ ๋ช
๋ ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ง์ง ์์ false๋ฅผ ๋ฐํํ ๊ฒ์ผ๋ก ๋ณดํต ์์ํ ๊ฒ์ด๋ค.
ํ์ง๋ง allMatch() ๋ฉ์๋๋ true๋ฅผ ๋ฐํํ๋ค.
์ด๋ Vacuous Truth ๋ผ๋ ๋
ผ๋ฆฌํ ๊ฐ๋
์์ ๋น๋กฏ๋ ๊ฒ์ผ๋ก, P์ด๋ฉด Q์ด๋ค. ๋ผ๋ ๋ช
์ ์์ P๊ฐ ๊ฑฐ์ง์ด๋ฉด Q๋ ์ฐธ์ด๋ ๊ฑฐ์ง์ด๋ ์๊ด์์ด ์ ์ฒด ๋ช
์ ๋ ์ฐธ์ด ๋๋ค๋ ๊ฐ๋
์ด๋ค.
Stream ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
์คํธ๋ฆผ ์ฌ์ฌ์ฉ
์คํธ๋ฆผ์ ๋จ ํ ๋ฒ๋ง ์๋นํ ์ ์๋ค.
์คํธ๋ฆผ์ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ์ปฌ๋ ์
์ ์ ์ฅํ๊ฑฐ๋ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํด์ผ ํ๋ค.
์คํธ๋ฆผ ํฌ๊ธฐ ๊ณ ๋ ค
ํฐ ๋ฐ์ดํฐ์
์ ๋ํด ์คํธ๋ฆผ์ ์์ฑํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํ๋ค.
๋์ฉ๋ ๋ฐ์ดํฐ์ ๋ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ OutOfMemoryError๋ฅผ ์ ๋ฐํ ์ ์๋ค.
๋ณ๋ ฌ ์คํธ๋ฆผ ์ฃผ์
parallelStream() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์์ฑํ ๋, ์ค๋ ๋ ์์ ์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ณ๋ ฌ๋ก ์คํ๋๋ ์ฐ์ฐ์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ฃผ์
์คํธ๋ฆผ์ ์กฐ์ํ๋ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข
์ฐ์ฐ ์ดํด
์ค๊ฐ ์ฐ์ฐ์ ์คํธ๋ฆผ์ ๋ฆฌํดํ๋ฉฐ, ์ต์ข
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
์คํธ๋ฆผ์ ์์ฑํ ํ ์ธ์ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข
์ฐ์ฐ์ ์ ์ฉํด์ผ ํ๋์ง๋ฅผ ๋ช
ํํ๊ฒ ์ดํดํด์ผ ํ๋ค.
์คํธ๋ฆผ ์ฐ์ฐ ์์ ์ฃผ์
์คํธ๋ฆผ ์ฐ์ฐ์ ์์๊ฐ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
Filtering ์ฐ์ฐ ํ Mapping ์ฐ์ฐํ๊ธฐ
Sorting ์ฐ์ฐ์ ๋ง์ง๋ง์ ์ํ
์ค๊ฐ ์ฐ์ฐ ์ค์ ํ์ํ ๋ฐ์ดํฐ๋ง ํฌํจํ๋๋ก ์ต์ ํ
๋ถํ์ํ ์ค๋ณต ์ฐ์ฐ ํผํ๊ธฐ
์คํธ๋ฆผ API ์ดํด
์คํธ๋ฆผ API์ ๋ค์ํ ์ฐ์ฐ์ ์ดํดํ๊ณ ํ์ฉํ๋ค.
์์ธ ์ฒ๋ฆฌ
์คํธ๋ฆผ ์ฐ์ฐ ์ค ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ค.
์คํธ๋ฆผ vs ๋ฐ๋ณต๋ฌธ ์ ํ
๋ชจ๋ ์์
์ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํญ์ ์ข์ ๊ฒ์ ์๋๋ค.
๊ฐ๋จํ ๋ฐ๋ณต ์์
์ ์ ํต์ ์ธ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ์๋ ์๋ค.
์คํธ๋ฆผ ์ฑ๋ฅ ์ต์ ํ
๋์ฉ๋ ๋ฐ์ดํฐ์ ๋ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ คํ ๋, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์คํธ๋ฆผ ๋ณ๋ ฌํ ๋ฐ ์ ์ ํ ์ค๊ฐ ์ฐ์ฐ์ ์ ํํด์ผ ํ๋ค.
์คํธ๋ฆผ ๋ฐ์ดํฐ ํ์
๋ณํ
์คํธ๋ฆผ์์ ๋ฐ์ดํฐ ํ์
๋ณํ ์ฐ์ฐ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.