BackEnd๐Ÿงต

2023.05.08 TIL - Stream

hae02y 2023. 5. 8. 23:25
๋ฐ˜์‘ํ˜•

 

๐Ÿ‘€Today...


 

 

โ˜•์˜ค๋Š˜์˜ TIL(Today I Learn)


์ŠคํŠธ๋ฆผ?

์ŠคํŠธ๋ฆผ(Stream)์€ ์ž๋ฐ”8๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐฐ์—ด ๋ฐ ์ปฌ๋ ‰์…˜์˜ ์ €์žฅ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด์„œ ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ˜๋ณต์ž์ด๋‹ค. for๋ฌธ์ด๋‚˜ Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žก ํ•ด์งˆ์ˆ˜์žˆ๋‹ค. ๋˜ํ•œ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Declarative Programming) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‚ด๋ถ€์˜ ๋™์ž‘์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ŠคํŠธ๋ฆผ์˜ ํŠน์ง• 

  • ์ŠคํŠธ๋ฆผ์˜ ์ฒ˜๋ฆฌ๊ณผ์ •์€ ์ƒ์„ฑ, ์ค‘๊ฐ„์—ฐ์‚ฐ, ์ตœ์ข…์—ฐ์‚ฐ 3๋‹จ๊ณ„์˜ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์›๋ณธ๋ฐ์ดํ„ฐ์˜ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€์•Š๋Š”๋‹ค.(read-only)
  • ์ŠคํŠธ๋ฆผ์€ 1ํšŒ์šฉ์ด๋‹ค.(ontime-only)
  • ์ŠคํŠธ๋ฆผ์€ ๋‚ด๋ถ€๋ฐ˜๋ณต์ž์ด๋‹ค.
๋”๋ณด๊ธฐ

์™ธ๋ถ€๋ฐ˜๋ณต์ž : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œํŒจํ„ด => for, while

 

๋‚ด๋ถ€๋ฐ˜๋ณต์ž : ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์—์„œ ์š”์†Œ๋“ค์„ ๋ฐ˜๋ณต์‹œํ‚ค๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ์š”์†Œ๋‹น ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ๋งŒ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด

->๋ณ‘๋ ฌ์ฒ˜๋ฆฌ : ํ•œ๊ฐ€์ง€ ์ž‘์—…์„ ์„œ๋ธŒ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์„œ๋ธŒ์ž‘์—…๋“ค์„ ๋ถ„๋ฆฌ๋œ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ

์™ธ๋ถ€ ๋ฐ˜๋ณต์ž / ๋‚ด๋ถ€๋ฐ˜๋ณต์ž

 

 

 

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

์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•ด์„  ๊ฐ€์žฅ๋จผ์ € ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

 

# ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

   public class StreamCreator {
   
       public static void main(String[] args) {
           // ๋ฌธ์ž์—ด ๋ฐฐ์—ด ์„ ์–ธ ๋ฐ ํ• ๋‹น
           String[] arr = new String[]{"๋งˆ๋•๋ฐฐ", "๊ธธ๋•๊ทผ", "๊น€๋ณต์ถ˜"};
   
           Stream<String> stream1 = Arrays.stream(arr);	//๋ฌธ์ž์—ด ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ1
           Stream<String> stream2 = Arrays.of(arr) //๋ฌธ์ž์—ด ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ2
       }
   }

 

# ์ˆซ์žํ˜• ์ŠคํŠธ๋ฆผ

1. int์š”์†Œ : IntStream

2. double์š”์†Œ : DoubleStream

3. long์š”์†Œ : LongStream

 

# ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

์ปฌ๋ ‰์…˜ํƒ€์ž…(List, Set ๋“ฑ) ์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Collection์— ์ •์˜๋œ Stream()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ• ์ˆ˜์žˆ๋‹ค.

public class StreamCreator {

    public static void main(String[] args) {
				// ์š”์†Œ๋“ค์„ ๋ฆฌ์ŠคํŠธ
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);	//๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ
        Stream<Integer> stream = list.stream();	//Integerํ˜• stream ์ƒ์„ฑ
    }
}

[์ฐธ๊ณ ] ์ฝœ๋ ‰์…˜

 

 

์ŠคํŠธ๋ฆผ "์ค‘๊ฐ„์—ฐ์‚ฐ"

์ค‘๊ฐ„์—ฐ์‚ฐ์ž(Intermediate Operation)๋ฅผ ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ Stream์œผ๋กœ ๋ฐ›์•„ Stream ํ˜•์‹์œผ๋กœ ๊ฐ€๊ณตํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

[์ฐธ๊ณ ] ์ŠคํŠธ๋ฆผ

 

# ํ•„ํ„ฐ๋ง

public class FilteringExample {
    public static void main(String[] args) throws Exception {

        List<String> names = Arrays.asList("๋ฐ•์ถ˜๋ฐฐ", "๊ธธ๋•๊ทผ", "ํ˜ธ๋‚ ๋‘");

        names.stream()
                .distinct() //์ค‘๋ณต์ œ๊ฑฐ
                .filter(element -> element.startsWith("๊ธธ")) // ๊ธธ์”จ ์„ฑ์„ ๊ฐ€์ง„ ์š”์†Œ๋งŒ ํ•„ํ„ฐ๋ง 
                .forEach(element -> System.out.println(element)); //์ตœ์ข…์—ฐ์‚ฐ forEach
    }
}

filter() : stream์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ์ •์ œํ•˜์—ฌ ๋”์ž‘์€ ์ปฌ๋ ‰์…˜์„ ๋ฑ‰์–ด๋‚ธ๋‹ค. filter()์˜ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์กฐ๊ฑด(Predicate)๋ฅผ ์ฃผ๊ณ  ์ฐธ์ด๋˜๋Š” ์š”์†Œ๋งŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ์กฐ๊ฑด์€ ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ• ์ˆ˜์žˆ๋‹ค.

distinct() : ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.

 

# ๋งคํ•‘

๋งคํ•‘์€ ์ŠคํŠธ๋ฆผ๋‚ด ์š”์†Œ๋“ค์—์„œ ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. filter์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋žŒ๋‹ค์‹์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

public class IntermediateOperationExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("guri", "daejeon", "seoul");
        List<Integer> list = Arrays.asList(1, 3, 6, 9);
        
        names.stream()
                .map(element -> element.toUpperCase()) // ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
                .forEach(element->System.out.println(element));
                
        list.stream()
                    .map(number -> number * 3)         //์š”์†Œ๋“ค์— 3์„ ๊ณฑํ•œ๊ฐ’์„ ๋ฐ˜ํ™˜
                    .forEach(System.out::println);
    }
}

map() : ์ƒ๋‹จ ์ฝ”๋“œ ์ฐธ์กฐ..!

flatMap() : ์ค‘์ฒฉ๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹จ์ผ์ปฌ๋ ‰์…˜์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋ฐฐ์—ด์— depth๊ฐ€ ์กด์žฌํ• ๋•Œ ํšจ์œจ์ ์ž„

 

# ์ •๋ ฌ

public class IntermediateOperationExample {
    public static void main(String[] args) {
				// ๋™๋ฌผ๋“ค์˜ ์ด๋ฆ„์„ ๋ชจ์•„๋‘” ๋ฆฌ์ŠคํŠธ 
        List<String> animals = Arrays.asList("Tiger", "Lion", "Monkey", "Duck", "Horse", "Cow");
				
        animals.stream().sorted().forEach(System.out::println); // ์ธ์ž๊ฐ’ ์—†๋Š” sorted() ํ˜ธ์ถœ(์˜ค๋ฆ„์ฐจ์ˆœ)
        
        animals.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); //์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ
    }
}

[์ฐธ๊ณ ] - Comparator

 

# ๊ธฐํƒ€

skip() : ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

limit() : ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€๋ฅผ ์ž๋ฅธ๋‹ค.

peak() : ์š”์†Œ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํŠน์ •์ž‘์—…์„ ์ˆ˜ํ–‰ (forEach์˜ ์ค‘๊ฐ„์—ฐ์‚ฐ์ž ๋ฒ„์ „?)

 

 

์ŠคํŠธ๋ฆผ "์ตœ์ข…์—ฐ์‚ฐ"

์ตœ์ข…์—ฐ์‚ฐ(Terminal Operation)์€ StreamํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ , ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์ด ๋‹ซํžˆ๋ฉฐ ๋ชจ๋“  ์—ฐ์‚ฐ์ด ์ข…๋ฃŒ๋œ๋‹ค. ์ค‘๊ฐ„์—ฐ์‚ฐ์€ ์ตœ์ข…์—ฐ์‚ฐ์ž๊ฐ€ ์ˆ˜ํ–‰๋ ๋•Œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋“ค์ด ์ค‘๊ฐ„์—ฐ์‚ฐ์„ ๊ฑฐ์ณ ์ตœ์ข…์—ฐ์‚ฐ์—์„œ ์†Œ๋ชจ๋œ๋‹ค. ์ด๋ฅผ ์ง€์—ฐ๋œ ์—ฐ์‚ฐ(Lazy evaluation) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ตœ์ข…์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋Š” Stream์œผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์—ฐ์‚ฐ์€ ํ•œ๋ฒˆ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

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

count() : ์ŠคํŠธ๋ฆผ ์š”์†Œ์˜ ์ด๊ฐœ์ˆ˜๋ฅผ longํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

max(), min() : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์ค‘ ๊ฐ€์žฅ ํฐ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” Optional ๊ฐ์ฒด๋ฅผ ์–ป๋Š”๋‹ค.

sum(), average() : IntStream, DoubleStream ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž… ์ŠคํŠธ๋ฆผ์— ์กด์žฌํ•˜๋ฉฐ ํ•ฉ๊ณผ ํ‰๊ท ์„ ๊ตฌํ•œ๋‹ค. average()๋Š” ๊ธฐ๋ณธํƒ€์ž…์œผ๋กœ ๋ž˜ํ•‘๋œ Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

long countEx = stream.count();
int maxEx = stream.max().getAsInt();
int sumEx = stream.sum()
int averageEx = stream.average().getAsInt(); //Optional๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜๋˜๋ฉด getAS์‚ฌ์šฉ..!

[์ฐธ์กฐ] - OptionalInt

[์ฐธ์กฐ] - Optional

 

# ๋งค์นญ match()

Stream ์š”์†Œ๋“ค์˜ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ์กฐ๊ฑด์‹ ๋žŒ๋‹ค Predicate๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ๋ฐ์ดํ„ฐ ์š”์†Œ๊ฐ€ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ boolean๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

allMatch() : ๋ชจ๋“ ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

noneMatch() : ๋ชจ๋“ ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

anyMatch() : ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

public class TerminalOperationExample {
    public static void main(String[] args) throws Exception {
        int[] intArray = {2,4,6}; //๋ฐฐ์—ด์„ ์–ธ
        // allMatch()
        boolean all = Arrays.stream(intArray).allMatch(element-> element % 2 == 0);
        
        // anyMatch()
        boolean any = Arrays.stream(intArray).anyMatch(element-> element % 3 == 0);

        // noneMatch()
        boolean non = Arrays.stream(intArray).noneMatch(element -> element % 3 == 0);
    }
}


# ์š”์†Œ ์†Œ๋ชจ reduce()

reduce() : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. reduce๋Š” ๋จผ์ € ์ฒซ๋ฒˆ์งธ์™€ ๋‘๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ์„ธ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋˜๋‹ค์‹œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.

T reduce(T identity, BinaryOperator<T> accumulator)

identity - ํŠน์ • ์—ฐ์‚ฐ์„ ์‹œ์ž‘ํ• ๋•Œ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐ๊ฐ’

accumulator - ๊ฐ์š”์†Œ๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ ๋‚˜์˜จ ๋ˆ„์ ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์‹

public class TerminalOperationExample {
    public static void main(String[] args) throws Exception {
        int[] intArray = {1,2,3,4,5};

        // sum()
        long sum = Arrays.stream(intArray).sum();

        // ์ดˆ๊ธฐ๊ฐ’์ด ์—†๋Š” reduce()
        int sum1 = Arrays.stream(intArray)
                .map(element -> element * 2)
	                .reduce((a , b) -> a + b)
                .getAsInt();

        // ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๋Š” reduce()
        int sum2= Arrays.stream(intArray)
                .map(element -> element * 2)
                .reduce(5, (a ,b) -> a + b);
    }
}

//์ดˆ๊ธฐ๊ฐ’ ์—†์„๋•Œ : 30 , ์ดˆ๊ธฐ๊ฐ’์žˆ์„๋•Œ : 35

[์ฐธ์กฐ] - reduce()

 

#์š”์†Œ์˜ ์ถœ๋ ฅ forEach()

์ŠคํŠธ๋ฆผ์˜ ๊ฐ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜์—ฌ ๋ช…์‹œ๋œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ฐ˜ํ™˜ํƒ€์ž…์ด void์—ฌ์„œ ๋ณดํ†ต ๋ชจ๋“ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 public class FilteringExample {
 	public static void main(String[] args) throws Exception {

        List<String> names = Arrays.asList("๊ธธ๋•๊ทผ", "๊ธธ๋•๊ทผ", "๊ธธ๋•๊ทผ", "๊น€๋‘ํ•œ", "๋ฐ•์œ ์ฒœ");

        names.stream()
                .distinct() //์ค‘๋ณต ์ œ๊ฑฐ
                .forEach(element -> System.out.println(element)); //forEach์‚ฌ์šฉ..
        }
}

[์ฐธ์กฐ] - forEach

 

# ์š”์†Œ์˜ ๊ฒ€์ƒ‰ find()

findFirst() : ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์—์„œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” Optional๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋น„์–ด์žˆ๋Š” ์ŠคํŠธ๋ฆผ์—์„œ๋Š” ๋น„์–ด์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

findAny() : ๋ณ‘๋ ฌ์ŠคํŠธ๋ฆผ์ธ ๊ฒฝ์šฐ์—๋Š” findAny()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•ํ•˜๋‹ค.

 int result1 = stream1.findFirst().getAsInt(); // ์ฒซ ๋ฒˆ์จฐ ์š”์†Œ ๋ฐ˜ํ™˜

 

# ์š”์†Œ ์ˆ˜์ง‘ collect()

collect() ๋ฉ”์„œ๋“œ๋Š” ์š”์†Œ๋“ค์„ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ์ตœ์ข…์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋“ค์„ List, Set, Map๋“ฑ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฒฐ๊ณผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— collect() ๋ฉ”์„œ๋“œ๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋‹ค collect()๋ฉ”์„œ๋“œ๋Š” Collector ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ์œผ๋ฉฐ, ์ด๋•Œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ์ œ๊ณต๋œ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

[์ฐธ์กฐ] - collector

์ŠคํŠธ๋ฆผ์„ ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ€ํ™˜ : toArray(), toCollection(), toList(), toSet(), toMap()
์š”์†Œ์˜ ํ†ต๊ณ„์™€ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ : counting(), maxBy(), minBy(), summingint(), averagingInt()
์š”์†Œ์˜ ์†Œ๋ชจ์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ : reducing(), joining()
์š”์†Œ์˜ ๊ทธ๋ฃนํ™”์™€ ๋ถ„ํ•  : groupingBy(), partitioningBy()
Stream<String> stream = Stream.of("์ผ", "์ด", "์‚ผ", "์‚ฌ");
List<String> list = stream.collect(Collectors.toList()); //list๋กœ ๋ณ€๊ฒฝ

       // ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ Map์œผ๋กœ ๋ฐ˜ํ™˜
        Map<String, Integer> maleMap = totalList.stream()
                .filter(s -> s.getGender() == Student.Gender.Male)
                .collect(Collectors.toMap(
                        student -> student.getName(), // Key
                        student -> student.getScore() // Value
                ));

 


๐Ÿ‘Šํ˜ผ์ž์„œ ํ•ด๊ฒฐํ•˜๊ธฐ


Stream ์—ฐ์Šต๋ฌธ์ œ ํ’€์ด

 

2023.05.04 - [My Thinking๐Ÿ˜€] - 2023.05.04 TIL - Stream ์—ฐ์Šต๋ฌธ์ œ ์ •๋ฆฌ (1 ~ 13๋ฒˆ)

 

 

๋ฐ˜์‘ํ˜•