SpringBoot๋ก Java๋ฅผ ์ค๋๋ง์ ์ฌ์ฉํ๊ฒ ๋์๋๋ฐ ์๋ ์ฝ๋๊ฐ ์๋ฆฌ๊ฐ ๋ญ์ง๊ฐ ์ดํด๊ฐ ์๋ผ์ Java ๋ฌธ๋ฒ์ ๊ณต๋ถํด๋ณด์๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Stream์ ๊ฐ๋ ์ ๋ค๋ฃฌ ํ ์๋ ์ฝ๋์ ๋์ ์๋ฆฌ๋ฅผ ๋ถ์ํด๋ณผ ๊ฒ์ด๋ค.
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny(); }
์ผ๋จ ๊ฐ๋ ๋ถํฐ ์ง๊ณ ๋์ด๊ฐ๋ณด์.
Stream์ ์ฉ๋์ ๊ตฌ์กฐ
Java8์์๋ถํฐ ์ง์ํ ๊ธฐ๋ฅ์ผ๋ก, ์ผ์ข ์ ๋ฐ๋ณต๋ฌธ์ ๊ฐ๋จํ๊ฒ ๋ํ๋ธ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
Stream์ ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด, ๋ฆฌ์คํธ ๋ฑ์ ์๋ ๊ฐ๋ค์ ์ฐธ๊ณ ํ์ฌ ๊ทธ ๊ฐ๋ค์ ๋ํด์ ์ฐ์ฐ์ ํด์ฃผ๋ API์ด๋ค.
Python์์ ๋ฐ๋ณต๋ฌธ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณด์ ๋ถ๋ค์ Python ๋ฐ๋ณต๋ฌธ์ in์ ์จ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค.
๋ณดํต์ ๋ฐ๋ณต๋ฌธ์์๋ for(int i=0; i<10; i++) {~~} ์ด๋ฐ์์ผ๋ก i๊ฐ ์ค์ ์ด ๋์๋ค๋ฉด, Python์์๋
for person in people : ~ ์ด๋ฐ์์ผ๋ก ๋์ด์์ด์ people์์ ์๋ person์ iterator๋ก ๋๋ฆด ์๊ฐ ์๋ค.
Java์ Stream ๊ธฐ๋ฅ์ ๋ฐฉ๋ฒ๋ง ์ตํ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋ ์์ ์์ฌ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
Stream์ ์ฌ์ฉํ ์์๋ฅผ ๋ณด๋ฉฐ ์๋ฆฌ๋ฅผ ๋ ์ ์ดํดํด๋ณด์.
//์ ์๋ค์ด ๋ด๊ธด ๋ฆฌ์คํธ์์ ์ง์์ธ ์ ์๋ง ๋ฝ์์ ์ด ์์ด๋ค๋ง ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ ์ฝ๋
List<Integer> intList =
new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
//1~8๊น์ง ์ ์๊ฐ ์๋ ๋ฆฌ์คํธ intList
Stream<Integer> filterResult =
intList.stream().filter(item -> item % 2 == 0);
//intList์ ์์ค๋ก stream์ ์์ฑ, stream์์์ ์ง์์ธ ์์ดํ
๋ง filterResult์ ๋ด์
filterResult.forEach(System.out::println);
//forEach๋ก stream์ ์๋ ๋ชจ๋ ๊ฐ๋ค์ ์ํํ๊ณ ์ด๋ฅผ ์ถ๋ ฅํจ
/** ์ถ๋ ฅ ๊ฒฐ๊ณผ
* 2
* 4
* 6
* 8
*/
Stream์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. stream ์์ฑ
2. ์ค๊ฐ ์ฐ์ฐ (stream ์์์ ์ด๋ค ์ ๋ค์ iterate ํ ๊ฒ์ธ๊ฐ ์ ์ ํ๊ณ ์ด๋ฅผ ๋ค์ Stream์ผ๋ก ๋ฐํ)
3. ์ต์ข ์ฐ์ฐ (์ค๊ฐ ์ฐ์ฐ์ ํตํด ๋ฝํ ์ ๋ค๋ก ์ด๋ค ์ฐ์ฐ์ ์งํํ ๊ฒ์ธ๊ฐ?)
์ต์ข ํ์์ ์๋์ ๊ฐ๋ค.
๋ฐ์ดํฐ์์ค.Stream ์์ฑ.์ค๊ฐ์ฐ์ฐ.์ต์ข ์ฐ์ฐ
intList.stream().filter(item->item%2==0).forEach(System.out::println); ๋ฅผ ์์ธํ ๋ณด์
์ฐ๋ฆฌ๋ intList๋ผ๋ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ,
stream์ ์์ฑํ๊ณ (stream()),
filter(item->item %2 ==0) ๋ก ์ ์์ธ item๋ง ๊ฐ์ ธ์จ ํ ์ด๋ฅผ ๋ค์ Stream์ผ๋ก ๋ฐํํ๊ณ ,
forEach(System.out::println) ์ ํตํด filter์์ ์ถ์ถ๋ stream์ item๋ค์ ๊ฐ๊ฐ ์ถ๋ ฅํ๋ค.
์กฐ๊ฑด์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ๋ filter๋ก ๋ค ๊ณ ๋ฅผ ์ ์๋ค. ์ฐธ๊ณ ๋ก filter ์์์๋ ๋๋ค์์ ์ฌ์ฉํ๋ค. ์๋ ์์ ๋ฅผ ๋ณด์
// ์กฐ๊ฑด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ
String[] strArray = {"ABC", "BAZ", "AZ", "ABCZ", "CC"};
List<String> strList =
new ArrayList<>(Arrays.asList(strArray));
Stream<String> filterResult =
strList.stream().filter((item) -> {
return item.startsWith("A") && item.endsWith("Z") && item.length() >= 3;
});
filterResult.forEach(System.out::println);
์์ ์ fiter((item) -> { return item.startWith("W") && item.endsWith("Z") && item.length() >=3; });๋ฅผ ๋ณด๋ฉด W๋ก ์์ํ๊ณ Z๋ก ๋๋๋ฉฐ ๊ธธ์ด๊ฐ 3์ด์์ธ item๋ง ๊ฐ์ ธ์ค๊ณ ์๋ค. ์ด๋ฐ์์ผ๋ก filter ์์์๋ ์ฌ๋ฌ ์กฐ๊ฑด์ &&๋ก ๋ฌถ์ด ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ item๋ค๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด์ Stream์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ฒ๋ฆฌํ๋์ง ์์ธํ ์ดํด๋ณด์.
1. Stream ์์ฑ์ ์ํ ๋ฐ์ดํฐ ์์ค
์ปฌ๋ ์ , ๋ฐฐ์ด, ๊ฐ๋ณ ๋งค๊ฐ๋ณ์, ๋๋ค ํํ์, ๋น ์คํธ๋ฆผ, ์ฐ์๋ ์ ์ ๋ฑ๋ฑ.....
์ ์์ ์์๋ ๋ฆฌ์คํธ๊ฐ ๋ฐ์ดํฐ ์์ค์๋ค.
2. ์ค๊ฐ ์ฐ์ฐ (๋ฐ๋ณตํ ์ ๋ค ์ ์ ํ๋ ๊ณผ์ )
Stream ํํฐ๋ง : flter(), distinct() -> ํด๋น ์คํธ๋ฆผ์์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง๋ ์์๋ง์ผ๋ก ๊ตฌ์ฑ๋ Stream์ ์๋ก ๋ฐํํจ (distinct๋ filter()์์ ์ค๋ณต๋๋ ์์ ์ ๊ฑฐ)
3. ์ต์ข ์ฐ์ฐ : ์ค๊ฐ ์ฐ์ฐ์ ํตํด ๋ง๋ค์ด์ง Stream์ ์์๋ค์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง?
forEach(๋์) : ์์๋ง๋ค '๋์'์คํ ex) .forEach(System.out::println)
findAny() : ์์์ ๊ฒ์ ํ ๋ฐํ
count(), min(), max(), sum(), average() ๋ฑ๋ฑ....
์ด์ ๋งจ ์์ ์๋ ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด์.
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny(); }
findByName์ name์ ์ธ์๋ก ๋ฐ๊ณ Member ๊ฐ์ฒด๋ฅผ Optional๋ก wrapping ํด์ ๋ฐํํ๋ค.
์ผ๋จ store.values()๋ฅผ ๋ฐ์ดํฐ ์์ค๋ก ์ผ๋๋ค. (store๋ HashMap<Long,Member> ๊ผด๋ก ์์์ ์ ์ธํ๋ค๊ณ ๊ฐ์ )
๊ทธ๋ฌ๋ฉด store.values()๋ HashMap์ ๋ชจ๋ Member๋ค์ด ๋ชจ์ฌ์๋ ์งํฉ์ผ ๊ฒ์ด๋ค.
์๋ฌดํผ ์ด ๋ฉค๋ฒ๋ค ์งํฉ์ค์์ ๋ฌด์์ ๋ฐ๋ณตํ ์ง ์ ์ ํ์.
filter(member->member.getName().equals(name)) ์ด๋ผ๊ณ ์จ์๋ค. ๋ฐ๋ผ์ member๋ค์ name์ ๋ค ๊ฐ์ ธ์จ ํ ํจ์์ ์ธ์๋ก ๋ฐ์ name๊ณผ ๋์ผํ member๋ง ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค.
findAny() ๋ฅผ ํตํด filter๋ฅผ ํตํด ๋ง๋ค์ด์ง ์ stream์ ๋ฉค๋ฒ๋ค์ ๋ฐํํ๊ฒ ๋๋ค.
Reference
https://developer-talk.tistory.com/730
[Java]Stream ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ - filter ๋ฉ์๋
filter ๋ฉ์๋ Stream ํด๋์ค์์ ์ ๊ณตํ๋ filter() ๋ฉ์๋๋ ์คํธ๋ฆผ ์์๋ฅผ ์ํํ๋ฉด์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ก ๊ตฌ์ฑ๋ ์๋ก์ด ์คํธ๋ฆผ์ ๋ฐํํฉ๋๋ค. Stream filter(Predicate
developer-talk.tistory.com
[Java] Java 8 Stream์ด๋? (tistory.com)
[Java] Java 8 Stream์ด๋?
Stream์ด๋? Java8๋ถํฐ ์ง์ํ๋ Stream์ ์ปฌ๋ ์ , ๋ฐฐ์ด๋ฑ์ ๋ํด ์ ์ฅ๋์ด์๋ ์์๋ค์ ํ๋์ฉ ์ฐธ์กฐํ๋ฉฐ ๋ฐ๋ณต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅ์ผํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๋ฌํ Stream์ ์ด์ฉํ๋ค๋ฉด ๋ถํ์ํ for๋ฌธ๊ณผ ๊ทธ ์
ahndding.tistory.com
'๐ฉโ๐ป Programming & Algorithm > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] Optional์ isPresent / ifPresent / ifPresentOrElse ๋ฉ์๋ (0) | 2023.03.14 |
---|