๐Ÿ“™ Java

[Java] ์ŠคํŠธ๋ฆผ(Stream)

ji_wonna 2022. 9. 17. 19:33

์ŠคํŠธ๋ฆผ์ด๋ž€?!

์ŠคํŠธ๋ฆผ์€ ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฐธ์กฐํ•˜์—ฌ ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐ˜๋ณต์ž์ด๋‹ค.

์ŠคํŠธ๋ฆผ์„ ํ™œ์šฉํ•˜๋ฉด ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์— ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

ํŠน์ง•

์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ณด๊ณ  ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

๋˜ํ•œ for๋ฌธ, while๋ฌธ์—์„œ index๋‚˜ iterator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž์™€ ๋‹ฌ๋ฆฌ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค. ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์‹œํ‚ค๋Š”์ง€๋Š” ์ถ”์ƒํ™”์‹œํ‚ค๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋˜ํ•œ ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ซํžˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

 

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

Collection ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” stream()์ด ์ •์˜๋˜์–ด ์žˆ์–ด์„œ Collection์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋“ค์€ ๋ชจ๋‘ stream()์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Collection์ด ์•„๋‹Œ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค๋กœ Stream์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Stream.of()๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Arrays.stream()์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

2. ์ค‘๊ฐ„ ์—ฐ์‚ฐ

์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•„ํ„ฐ๋ง

distinct() : Stream ์š”์†Œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

filter() : ๋งค๊ฐœ ๊ฐ’์œผ๋กœ ์กฐ๊ฑด์ด ์ฃผ์–ด์ง€๊ณ  ์กฐ๊ฑด์ด ์ฐธ์ด ๋˜๋Š” ์š”์†Œ๋งŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค.

 

๋งคํ•‘

map() : ๊ธฐ์กด์˜ ์š”์†Œ๋“ค์„ ๋Œ€์ฒดํ•˜๋Š” ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด Stream์„ ํ˜•์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค.

 

์ •๋ ฌ

sorted() : ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋˜๋ฉฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋น„๊ต์ž๋ฅผ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

ex) ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ : sorted(Comparator.reverseOrder())

 

์—ฐ์‚ฐ ๊ฒฐ๊ณผ ํ™•์ธ

peek() : ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ๋ฉด์„œ ์ถœ๋ ฅํ•˜๋ฉฐ ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ ์ด๋‹ค. ์ฃผ๋กœ ์—ฐ์‚ฐ ์ค‘๊ฐ„์— ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

3. ์ตœ์ข… ์—ฐ์‚ฐ

์ตœ์ข… ์—ฐ์‚ฐ์€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ๋งŒ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์—ฐ์‚ฐ ๊ฒฐ๊ณผ ํ™•์ธ

forEach() : peek()๊ณผ ๋™์ผํ•˜๊ฒŒ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ๋ฉด์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๋งค์นญ

match() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Stream์˜ ์š”์†Œ๋“ค์ด ํŠน์ • ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

allMatch() : ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋งค๊ฐœ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ

anyMatch() : ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ

noneMatch() : ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ

 

๊ธฐ๋ณธ ์ง‘๊ณ„

์š”์†Œ๋“ค์˜ ํ•ฉ๊ณ„, ์นด์šดํŒ…, ํ‰๊ท ๊ฐ’, ์ตœ๋Œ€๊ฐ’, ์ตœ์†Ÿ๊ฐ’์„ ์—ฐ์‚ฐํ•˜์—ฌ ๊ฐ’์œผ๋กœ ์‚ฐ์ถœํ•œ๋‹ค.

๋ฉ”์„œ๋“œ๋กœ๋Š” sum(), count(), average(), max(), min()์ด ์žˆ๋‹ค.

 

๋ณ€ํ™˜

Stream์˜ ์š”์†Œ๋“ค์„ List๋‚˜ Set, Map ๋“ฑ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— collect() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

list.stream()
    .collect(Collectors.toList());

 

 

 

์˜ˆ์ œ

ex1 ) String ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ€์ง€๋Š” List๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์ •๋ ฌํ•œ ํ›„ String ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ด

public class Solution { 
  public String[] makeUniqueNameArray(List<String> names) {
    return names.stream()
    .distinct()
    .sorted()
    .toArray(String[]::new);
  }
}

 

ex2 ) String ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ€์ง€๋Š” List ๋‘ ๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ List๋กœ ํ•ฉ์นœ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด

public class Solution { 
  public List<String> mergeTwoStream(List<String> list1, List<String> list2) {
    List<String> result = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
    return result;
  }
}

 


 

Optional

Optional์€ NullPointerException(NPE)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ฐจ์›์—์„œ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” Wrapper ํด๋ž˜์Šค์ด๋‹ค.

์ŠคํŠธ๋ฆผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ , ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ Optional ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋”ฐ๋กœ ์กฐ๊ฑด๋ฌธ์„ ์“ฐ์ง€ ์•Š์•„๋„ NPE๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” of(), ๋งŒ์•ฝ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ofNullable()์„ ์‚ฌ์šฉํ•œ๋‹ค.

Optional<String> opt1 = Optional.ofNullable("111");

 

Optional ๊ฐ์ฒด์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” get()์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์ด null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด orElse()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ default ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Optional (Java Platform SE 8 )

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orEl

docs.oracle.com