[Java] Stream

Wishยท2025๋…„ 4์›” 18์ผ

Java

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

Stream

๐Ÿ’ก ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๋žŒ๋‹ค์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Stream์ด ํ•„์š”ํ•œ ์ด์œ 

  1. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊บผ๋‚ด๋ฉด ์ฝ”๋“œ ์–‘์ด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋ณต์žก์„ฑ๋„ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  2. ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜ ํ•จ์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ ์–‘์„ ์ค„์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
/* Stream */
List<String> list = new ArrayList<>(
        Arrays.asList("hello", "stream","world")
);

/* ํŠน์ • ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด iterator ๋˜๋Š” foreach ๋“ฑ์„ ํ™œ์šฉ */
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String str = iterator.next();
    if(str.equals("stream")) {
        System.out.println("๊ฑธ๋Ÿฌ๋‚ธ ๊ฐ’ : " + str);
    }
}

/* ์œ„์˜ ๋™์ž‘์„ Stream์„ ํ™œ์šฉํ•ด ์ˆ˜ํ–‰ */
list.stream()
    .filter("stream"::equals)
    .forEach(str -> System.out.println("๊ฑธ๋Ÿฌ์ง„ ๊ฐ’ : " + str));

Stream ํŠน์ง•

  1. ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ฝ๊ธฐ ์ „์šฉ ๊ธฐ๋Šฅ์ด๋‹ค.
  2. iterator ์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.
    • ํ•„์š” ์‹œ์— ์žฌ์ƒ์„ฑ ํ•ด์•ผํ•œ๋‹ค.
  3. ์ตœ์ข… ์—ฐ์‚ฐ ์ „๊นŒ์ง€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. (์ง€์—ฐ ์ฒ˜๋ฆฌ)
  4. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
public static void main(String[] args) {
    /* ์ŠคํŠธ๋ฆผ์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ */
    List<String> list = new ArrayList<>(
            Arrays.asList("java", "mariadb", "html", "css", "mybatis")
    );
    
    /* ๋ชจ๋“  ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ main ์Šค๋ ˆ๋“œ์—์„œ ์ผ์–ด๋‚œ๋‹ค. */
    System.out.println("for each ===================");
    for(String s : list ){
        print(s);
    }
    
    System.out.println("normal stream ==================");
    list.stream().forEach(Application2::print);
    
    /* ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ํ™œ์šฉ */
    /* ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. */
    /* ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. */
    System.out.println("parallel stream ==================");
    list.parallelStream().forEach(Application2::print);
    list.parallelStream().forEach(Application2::print);
}

private static void print(String str) {
    System.out.println(str + " : " + Thread.currentThread().getName());
}

Stream ํ™œ์šฉ

  1. ์ƒ์„ฑ : ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
  2. ๊ฐ€๊ณต : ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•„ํ„ฐ๋ง, ๋งคํ•‘ ๋“ฑ์˜ ์ž‘์—…
  3. ๊ฒฐ๊ณผ : ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•œ๋‹ค.
    ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜ -> ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ -> ๋งคํ•‘ -> ํ•„ํ„ฐ๋ง -> ๊ฒฐ๊ณผ

Stream ์ƒ์„ฑ

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

/* ๋ฐฐ์—ด์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒ์„ฑ*/
String[] sarr = {"java", "mariadb", "jdbc"};
Stream<String> strStream1 = Arrays.stream(sarr);

/* forEach() : Consumer ํƒ€์ž…์„ ๋ฐ›์•„ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ„*/
strStream1.forEach(System.out::println);

/* ์›ํ•˜๋Š” ์ธ๋ฑ์Šค ๊ฐ’๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. */
Stream<String> strStream2 = Arrays.stream(sarr, 0, 2);
strStream2.forEach(System.out::println);

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

/* ์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒ์„ฑ*/
List<String> stringList = Arrays.asList("html", "css", "javascript");
Stream<String> strStream3 = stringList.stream();
strStream3.forEach(System.out::println);

/* ์ปฌ๋ ‰์…˜์—๋„ foreach() ๊ธฐ๋Šฅ์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค. */
/* ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ foreach() ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•  ๋Œ€์—๋Š” streamํ™” ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. */
stringList.forEach(System.out::println);

Stream().builder()

/* Builder๋ฅผ ํ™œ์šฉํ•œ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ */
/* ์—˜๋ ˆ๋จผํŠธ๋กœ ๋ฐ”๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. */
Stream<String> strStream4 = Stream.<String>builder()
        .add("ํ™๊ธธ๋™")
        .add("์œ ๊ด€์ˆœ")
        .add("์œค๋ด‰๊ธธ")
        .build();
strStream4.forEach(System.out::println);

Stream().iterate()

/* iterate() ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ˆ˜์—ด  ํ˜•ํƒœ์˜ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ */
/* Stream.iterate(์‹œ์ž‘์ , ์ „๋‹ฌ๋œ ๊ฐ’์˜ ๊ทœ์น™)[.limit(ํšŸ์ˆ˜)] */
Stream<Integer> intStream =
        Stream.iterate(10, value -> value * 2).limit(10);
intStream.forEach(System.out::println);

๊ธฐ๋ณธ ํƒ€์ž… ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

/* ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ */
/* ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค ๋ฒ”์œ„ 5 ~ 9*/
IntStream intStream = IntStream.range(5, 10);
intStream.forEach(i -> System.out.print(i + " "));
System.out.println();

/* rangeClosed(์‹œ์ž‘๊ฐ’, ๋งˆ์ง€๋ง‰๊ฐ’) :> ๋งˆ์ง€๋ง‰ ๊ฐ’ ํฌํ•จ*/
LongStream longStream = LongStream.rangeClosed(5, 10);
longStream.forEach(i -> System.out.print(i + " "));
System.out.println();

/* Wrapper ํด๋ž˜์Šค ์ž๋ฃŒํ˜•์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ boxing ํ•  ์ˆ˜ ์žˆ๋‹ค. */
Stream<Double> doubleStream = new Random().doubles(5).boxed();
doubleStream.forEach(i -> System.out.print(i + " "));
System.out.println();

๋ฌธ์ž ๊ด€๋ จ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

/* ๋ฌธ์ž์—ด์„ IntStream์œผ๋กœ ๋ณ€ํ™˜*/
/* chars() : ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ IntStream()d์œผ๋กœ ๋ณ€๊ฒฝ */
IntStream helloworldChars = "hello world".chars();
helloworldChars.forEach(i-> System.out.print(i + " "));
System.out.println();

/* ๋ฌธ์ž์—ด splitํ•ด์„œ Stream์œผ๋กœ ์ƒ์„ฑ */
Stream<String> splitStream =
        Pattern.compile(", ")
                .splitAsStream("html, css, javascript");
splitStream.forEach(i-> System.out.print(i + " "));
System.out.println();

์ŠคํŠธ๋ฆผ ํ•ฉ์น˜๊ธฐ

/* Stream.of() */
/* ์š”์†Œ๋ฅผ ๋„ฃ์–ด ๋ฐ”๋กœ Stream ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. */
Stream<String> stringStream1 = Stream.of("hello", "world");
Stream<String> stringStream2 = Stream.of("java", "mariadb");
/* ์ŠคํŠธ๋ฆผ์€ 1ํšŒ์šฉ์ด๋‹ค. */
/* ์ตœ์ข… ์—ฐ์‚ฐ (ex: foreach()) ๋“ฑ์ด ์ˆ˜ํ–‰๋œ ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. */
/* ์žฌ์‚ฌ์šฉ ์‹œ java.lang.IllegalStateException์ด ๋ฐœ์ƒํ•œ๋‹ค. --> ์ฃผ์„ ์ฝ”๋“œ ํ’€๋ฉด concat ์—์„œ ๋ฐœ์ƒ  */
/*
stringStream1.forEach(i -> System.out.print(i +" "));
stringStream2.forEach(i -> System.out.print(i +" "));
*/
/* concat() : ์ŠคํŠธ๋ฆผ์„ ํ•ฉ์น˜๋Š” ๋ฉ”์†Œ๋“œ */
Stream<String> concatStream = Stream.concat(stringStream1, stringStream2);
concatStream.forEach(i -> System.out.print(i + " "));
System.out.println();

Stream ๊ฐ€๊ณต

์ŠคํŠธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•˜๋Š” ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ์ž‘์—…์„ โ€˜๊ฐ€๊ณตโ€™์ด๋ผ ํ•œ๋‹ค.
์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋ฉ”์†Œ๋“œ๋“ค์€ Stream์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ Stream์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์—ฐ์†์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋•Œ filter-map ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

Filter

  • ์ŠคํŠธ๋ฆผ์—์„œ ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” Predicate๋Š” boolean์„ ๋ฆฌํ„ดํ•˜๋Š” @FunctionalInterface์ด๋‹ค.
/* ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ, ์ค‘๊ณ„ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜์ธ filter ์‚ฌ์šฉ */
/* 0 ~ 9 ๊นŒ์ง€ ์ŠคํŠธ๋ฆผํ™” */
IntStream intStream = IntStream.range(0, 10);

/* **filter** : ์ŠคํŠธ๋ฆผ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. */
/* ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ **Predicate** ํƒ€์ž…์ด ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. */
/* ใ„ด> ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ boolean ํƒ€์ž… ๋ฐ˜ํ™˜ */
intStream.filter(i -> i % 2 == 0).forEach(System.out::println);

Map

  • ์ŠคํŠธ๋ฆผ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ๋žŒ๋‹ค์‹์„ ํ†ตํ•ด ๊ฐ€๊ณตํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Operationํƒ€์ž…์œผ๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์ด ๊ฐ™๋‹ค.
/* ์ŠคํŠธ๋ฆผ ์ค‘๊ณ„ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜์ธ map() ์‚ฌ์šฉ */
/* ์ค‘๊ณ„ ์—ฐ์‚ฐ์€ ์ตœ์ข… ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์ „๊นŒ์ง€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค. */
/* ๋จผ์ € ์ผ์–ด๋‚œ ์ค‘๊ณ„ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๋‹ค์Œ ์ค‘๊ณ„ ์—ฐ์‚ฐ์œผ๋กœ ์ „๋‹ฌ ๋œ๋‹ค. */
IntStream intStream = IntStream.range(0, 10);

/* map : ์ŠคํŠธ๋ฆผ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ๋žŒ๋‹ค์‹์„ ํ†ตํ•ด ๊ฐ€๊ณตํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์— ๋‹ด๋Š”๋‹ค. */
/* map์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” **Operation** ํƒ€์ž…์œผ๋กœ , ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ํƒ€์ž…์ด ๊ฐ™๋‹ค. */
intStream.filter(i -> i % 2 == 0).map(i -> i * 5).forEach(System.out::println);
profile
์›ํ•˜๋Š” ๊ฒƒ์„ ์ด๋ค„๊ฐ€๋Š” ์ค‘ ๐Ÿ€

0๊ฐœ์˜ ๋Œ“๊ธ€