rosieblue
article thumbnail
728x90

 

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
profile

rosieblue

@Rosieblue

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!