IT/development

[Java] Java Stream ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ(jdk 1.8 ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2022. 11. 23.

๋ชฉ์ฐจ

    image source:https://unsplash.com/s/photos/java

    Java Stream ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ๐Ÿ˜ƒ

    Java 1.8๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ์‹œ์ž‘ํ•œ stream์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ๊ธฐ๋กํ•œ๋‹ค.

    ๊ทธ๋™์•ˆ stream์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ์ด ๊ธฐํšŒ์— ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

    ์•ž์œผ๋กœ jdk 1.8์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜ ๋‹ค๋ฃฐ ๋•Œ for๋ฌธ ๋„๋ฐฐํ•˜๊ธฐ ๋ณด๋‹จ ํšจ์œจ์ ์œผ๋กœ stream์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๋ถ€ํ•  ์˜ˆ์ •์ด๋‹ค.๐Ÿค—

    ์˜ˆ๋ฅผ ๋“ค์–ด intํƒ€์ž… ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ list๋กœ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๊ธด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

    ์ด๋ฅผ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ์•„๋ž˜ ํ•œ์ค„์ด๋ฉด ๋œ๋‹ค.

    ์ด๋ฅผ ์ข€ ๋” ํ’€์ดํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    System.out.println(Arrays.stream(arr).boxed()	// stream ์ƒ์„ฑ
                    .distinct()	// ์ค‘๋ณต ์ œ๊ฑฐ
                    .sorted(Comparator.reverseOrder())	// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
                    .collect(Collectors.toList())	// list๋กœ ๋ฐ˜ํ™˜
    );

    stream์— ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ๋“ค์„ ์ž˜ ๋ถ™์ด๋ฉด ํšจ์œจ์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


    stream์€ ์„ ์–ธ(์ƒ์„ฑ), ๊ฐ€๊ณต, ๋ฐ˜ํ™˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ง

    ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    ์„ ์–ธ(์ƒ์„ฑ)๐Ÿฅฐ

    ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜(list, set, map..etc) ๋“ฑ์„ stream ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

    String[] arr = {"a", "b", "c", "a", "b", "c", "f"};
    List<String> list = Arrays.asList(arr); 
    
    // ๋ฐฐ์—ด stream ์ƒ์„ฑ
    Stream<String> stream = Arrays.stream(arr);
    // ์ปฌ๋ ‰์…˜ stream ์ƒ์„ฑ
    Stream<String> cStream = list.stream();
    // ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ stream ์ƒ์„ฑ
    Stream<String> paStream = list.parallelStream();

    ์ŠคํŠธ๋ฆผ์„ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ๋„ฃ๋Š” ์œ„ ๋ฐฉ๋ฒ• ๋ง๊ณ ๋„ ์•„๋ž˜์ฒ˜๋Ÿผ ์ง์ ‘ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    Arrays.stream(arr).๋ฉ”์†Œ๋“œ()...
    list.stream(arr).๋ฉ”์†Œ๋“œ()...

     

    ๊ฐ€๊ณต๐Ÿ˜

    ์ŠคํŠธ๋ฆผ์„ ํ•„์š”ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•œ๋‹ค.

    .boxed()

    int, Long, Double ๋“ฑ ์ˆซ์ž ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ stream์œผ๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ stream ๊ฐ์ข… ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

    ๋” ์ฐพ์•„๋ณด๋‹ˆ IntStream์„ Stream์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ boxed()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

    int ์ž์ฒด๋กœ๋Š” Collection์— ๋ชป ๋‹ด๊ธฐ์— Integer ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ List<Integer> ๋กœ ๋‹ด๋Š” ์šฉ๋„ ๋“ฑ์— ์‚ฌ์šฉ

    ex) IntStream -> Stream<Integer>

    ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    // ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ ๋’ค list๋กœ ๋ฐ˜ํ™˜๋ฐ›๋Š” ์ฝ”๋“œ(ํŽธ์˜ ์ƒ ํ•œ์ค„๋กœ ์”€)
    System.out.println(Arrays.stream(arr).boxed().distinct().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));

     

    .count()

    ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜ ํฌ๊ธฐ ํ™•์ธ

    // ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ํ™•์ธ
    System.out.println(Arrays.stream(arr).count());
    // ์ปฌ๋ ‰์…˜(list)์˜ ํฌ๊ธฐ ํ™•์ธ
    System.out.println(list.stream().count());

     

    .sorted()

    ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉ

    ์•„๋ž˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ intํ˜• ๋ฐฐ์—ด์ธ arr๊ณผ list์˜ ๊ฐ’์ด ์ •๋ ฌ๋œ ๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // ๋ฐฐ์—ด ์ •๋ ฌ
    System.out.println("๋ฐฐ์—ด ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ : " + Arrays.stream(arr).boxed().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜(list)์˜ ํฌ๊ธฐ ํ™•์ธ
    System.out.println("์ปฌ๋ ‰์…˜ ์ •๋ ฌ : " + list.stream().sorted().collect(Collectors.toList()));

     

    .sorted(Comparator.reverseOrder())

    ์—ญ์ •๋ ฌ(๋‚ด๋ฆผ์ฐจ์ˆœ)ํ•  ๋•Œ ์‚ฌ์šฉ

    		// ๋ฐฐ์—ด ์—ญ์ •๋ ฌ
    		System.out.println(Arrays.stream(arr).boxed().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));
    		// ์ปฌ๋ ‰์…˜ ์—ญ์ •๋ ฌ
    		System.out.println(list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));

     

    .findFirst()

    ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ ์งธ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ ์ฒซ๋ฒˆ ์งธ ๊ฐ’ ๊ฐ€์ ธ์˜จ๋‹ค.
    System.out.println(Arrays.stream(arr).findFirst().getAsInt());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ ์ฒซ๋ฒˆ ์งธ ๊ฐ’ ๊ฐ€์ ธ์˜จ๋‹ค.
    System.out.println(list.stream().findFirst().get());

     

    .skip(index)

    ๊ฐ’์˜ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ƒ๋žตํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๋ฒˆ์ง€๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ๋‹ค.

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ œ์™ธํ•œ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
    System.out.println(Arrays.stream(arr).boxed().skip(1).collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ œ์™ธํ•œ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
    System.out.println(list.stream().skip(1).collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ์ฒซ๋ฒˆ ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ œ์™ธํ•œ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.(skip์— 0์„ ๋„ฃ์–ด๋ณด๋‹ˆ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๊ฑธ ๋ณด๋‹ˆ 1๋ฒˆ์ง€๋ถ€ํ„ฐ ์‹œ์ž‘์ธ ๋“ฏ ์‹ถ๋‹ค.)
    System.out.println(list.stream().skip(0).collect(Collectors.toList()));

     

    .skip(๋ฐฐ์—ดํฌ๊ธฐ -1).findFirst()

    ์ŠคํŠธ๋ฆผ์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฐพ๊ธฐ
    System.out.println(Arrays.stream(arr).skip(arr.length -1).findFirst().getAsInt());
    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ๋งˆ์ง€๋ง‰์—์„œ ๋‘๋ฒˆ ์งธ ๊ฐ’ ์ฐพ๊ธฐ
    System.out.println(Arrays.stream(arr).skip(arr.length -2).findFirst().getAsInt());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฐพ๊ธฐ
    System.out.println(list.stream().skip(list.size() - 1).findFirst().get());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ๋งˆ์ง€๋ง‰์—์„œ ๋‘๋ฒˆ ์งธ ๊ฐ’ ์ฐพ๊ธฐ
    System.out.println(list.stream().skip(list.size() - 2).findFirst().get());

     

    .limit(index)

    ์ธ๋ฑ์Šค๊นŒ์ง€๋งŒ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ 5๋ฒˆ ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€๋งŒ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    System.out.println(Arrays.stream(arr).boxed().limit(5).collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ 5๋ฒˆ ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€๋งŒ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    System.out.println(list.stream().limit(3).collect(Collectors.toList()));

     

    .distinct()

    ์ค‘๋ณต ์ƒ๋žต

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ์ค‘๋ณต ์ƒ๋žตํ•œ ๊ฐ’
    System.out.println(Arrays.stream(arr).boxed().distinct().collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ์ค‘๋ณต ์ƒ๋žตํ•œ ๊ฐ’
    System.out.println(list.stream().distinct().collect(Collectors.toList()));

     

    .max(๋ฐ์ดํ„ฐํƒ€์ž…::compare)

    ์ตœ๋Œ€๊ฐ’

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ์ตœ๋Œ€๊ฐ’
    System.out.println(Arrays.stream(arr).boxed().max(Integer::compare).get());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ์ตœ๋Œ€๊ฐ’
    System.out.println(list.stream().max(Integer::compare).get());

     

    .min(๋ฐ์ดํ„ฐํƒ€์ž…::compare)

    ์ตœ์†Œ๊ฐ’

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ์ตœ์†Œ๊ฐ’
    System.out.println(Arrays.stream(arr).boxed().min(Integer::compare).get());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ์ตœ์†Œ๊ฐ’
    System.out.println(list.stream().min(Integer::compare).get());

     

    .average()

    ํ‰๊ท 

    ๋ฐฐ์—ด์€ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ mapToDouble(Integer::doubleValue)์„ ํ•œ๋ฒˆ ๊ฑฐ์นœ ๋‹ค์Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ํ‰๊ท 
    System.out.println(Arrays.stream(arr).average().getAsDouble());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ํ‰๊ท (์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ ์•„๋ž˜์ฒ˜๋Ÿผ .mapToDouble(Integer:doubleValue)์„ ํ•œ๋ฒˆ ์”Œ์šด ๋‹ค์Œ .average() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    System.out.println(list.stream().mapToDouble(Integer::doubleValue).average().getAsDouble());

     

    .sum()

    ํ•ฉ๊ณ„

    .average()์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ mapToInt(Integer::intValue)๋กœ ํ•œ๋ฒˆ ๋ณ€๊ฒฝ ํ•„์š”

    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์˜ ํ•ฉ๊ณ„
    System.out.println(Arrays.stream(arr).sum());
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์˜ ํ•ฉ๊ณ„
    System.out.println(list.stream().mapToInt(Integer::intValue).sum());

    ๋žŒ๋‹ค(Lambda)๋ฅผ ํ™œ์šฉํ•œ stream ๋ฉ”์†Œ๋“œ๐Ÿ˜Ž

    ๋žŒ๋‹ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๊ธ€ ์ฐธ์กฐ

     

    [Java] Java Lambda ์ •๋ฆฌ(jdk 1.8๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

    ๋ชฉ์ฐจ ์—ฐ์ฐจ๋Š” ์Œ“์ด๋Š”๋ฐ ๊ณต๋ถ€๋Š” ๋์ด ์—†๊ณ  ์•„์ง ๋ชจ๋ฅด๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ๊ทธ๋ž˜์„œ ๋…ธ์‡ ํ•ด์„œ ์ฝ”๋”ฉ์„ ๋ชปํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๊พธ์ค€ํžˆ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ๊ณต๋ถ€ํ•ด์„œ ๋ฉ”๊ฟ€ ์ƒ๊ฐ์ด๋‹ค. Java Lambda ์ •๋ฆฌ(java 1.8 ์ด์ƒ๋ถ€ํ„ฐ ๊ฐ€๋Šฅ

    yaga.tistory.com

    ๋žŒ๋‹ค(Lambda)

    ๋žŒ๋‹ค์˜ ํ•ต์‹ฌ์€ (paramter) -> { ์ˆ˜ํ–‰ ์ฝ”๋“œ }๋ฅผ ํ†ตํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

    Lambda๋Š” ์•„๋ฌด ๊ณณ์—์„œ๋‚˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๋Œ€๋ถ€๋ถ„์€ ์ŠคํŠธ๋ฆผ์ด๋‚˜ forEach ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ผํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

    Lambda๋ฅผ ์ด์šฉํ•œ list, map ์ถœ๋ ฅ

    .map((function) -> ์ˆ˜ํ–‰ ์ฝ”๋“œ)

    ํ•จ์ˆ˜๋ฅผ paramter๊ฐ’์œผ๋กœ ๋„˜๊ธฐ๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฃผ๋กœ ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๊ฑฐ๋‚˜ ๋”ํ•ด์ค„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    map์€ ์ฝ”๋“œ์—์„œ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๊ฑด .forEach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

    //userVo list๋ฅผ userDto list๋กœ ๋ณ€ํ™˜
    public List<UserDto> selectUserList() throws Exception{
    
          List<UserVo> userVoList =  userMapper.selectUserList();
          List<UserDto> userDtoList = userVoList.stream().
          map(u -> new UserDto(u.getUserNo(), u.getName(), u.getEmail(), u.getPassword())).collect(Collectors.toList());
            return userDtoList;
       }
    // ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ์—์„œ map์ด 1์ด๋ฉด true ์•„๋‹ˆ๋ฉด false
    System.out.println(Arrays.stream(arr).boxed().map(val -> val == 1).collect(Collectors.toList()));
    // ์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ์—์„œ map์ด 1์ด๋ฉด true ์•„๋‹ˆ๋ฉด false
    System.out.println(list.stream().map(val -> val ==1).collect(Collectors.toList()));

    // map ๊ฐ’๋งˆ๋‹ค 10 ๋”ํ•˜๊ธฐ
    System.out.println(Arrays.stream(arr).boxed().map(val -> val = val + 10).collect(Collectors.toList()));
    System.out.println(list.stream().map(val -> val = val + 10).collect(Collectors.toList()));

    // map ๊ฐ’ ๋ฐ˜์˜ฌ๋ฆผ
    System.out.println(Arrays.stream(arr).boxed().map(val -> Math.round(val*10)/10.0).collect(Collectors.toList()));
    System.out.println(list.stream().map(val -> Math.round(val*10)/10.0).collect(Collectors.toList()));

     

    .forEach((parameter) -> ์ฝ”๋“œ)

    ๊ฐ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ parameter๊ฐ’์œผ๋กœ ๋„˜๊ธฐ๊ณ  ์ฝ”๋“œ ์ˆ˜ํ–‰

    ๊ฐ’๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•  ๋•Œ ์‚ฌ์šฉ

    // forEach(๋ชจ๋“  ๊ฐ’๋งˆ๋‹ค ์ž…๋ ฅํ•œ ๋‚ด์šฉ ์ˆ˜ํ–‰)
    Arrays.stream(arr).boxed().forEach(val -> System.out.println("forEach print : " + val));
    System.out.println();
    list.stream().forEach(val -> System.out.println("ForEach print : " + val));

     

    .anyMatch((paramter) -> {์ฝ”๋“œ})

    ์ŠคํŠธ๋ฆผ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์ด๋ผ๋„ ์กฐ๊ฑด์— ๋งž์œผ๋ฉด true

    // ์ŠคํŠธ๋ฆผ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งž์œผ๋ฉด true
    System.out.println(Arrays.stream(arr).anyMatch(val -> val == 100));
    System.out.println(list.stream().anyMatch(val -> val == 40));

     

    .noneMatch((parameter) -> {์ฝ”๋“œ})

    ์ŠคํŠธ๋ฆผ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’๋„ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด true

    // ์ŠคํŠธ๋ฆผ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋„ ์•ˆ๋งž์œผ๋ฉด true
    System.out.println(Arrays.stream(arr).noneMatch(val -> val == 10));
    System.out.println(list.stream().noneMatch(val -> val == 99));

     

    .allMatch((parameter) -> {์ฝ”๋“œ})

    ์ŠคํŠธ๋ฆผ์˜ ๊ฐ’์ด ๋ชจ๋‘ ์กฐ๊ฑด์— ๋งž์•„์•ผ true

    // ์ŠคํŠธ๋ฆผ ๊ฐ’ ์ค‘ ๋ชจ๋‘ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋ฉด true
    System.out.println(Arrays.stream(arr).allMatch(val -> val == 30));
    System.out.println(list.stream().allMatch(val -> val == 1));

     

    .filter((parameter) -> {์ฝ”๋“œ})

    ์ฝ”๋“œ์— ๋งž๋Š” ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค. ์ž์ฃผ ์“ฐ์ด๋Š” ํ•จ์ˆ˜์ด๋‹ค.

    // ์กฐ๊ฑด์— ํ•ด๋‹น๋˜๋Š” ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
    System.out.println(Arrays.stream(arr).boxed().filter(val -> val == 10).collect(Collectors.toList()));
    System.out.println(list.stream().filter(val -> val == 100).collect(Collectors.toList()));

     

    .reduce(๊ฐ’, ๋ฐ์ดํ„ฐํƒ€์ž…::sum)

    ์ŠคํŠธ๋ฆผ์˜ ๊ฐ’์„ ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•จ

    ๋ฐ์ดํ„ฐํƒ€์ž…๊ณผ sum์œผ๋กœ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ๋’ค ๋งˆ์ง€๋ง‰์— ๊ฐ’์„ ๋”ํ•ด์„œ ๋ฐ˜ํ™˜ํ•จ

    (String์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐ’, String::concat์„ ์‚ฌ์šฉ)

    // ์ŠคํŠธ๋ฆผ ๊ฐ’์„ ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  ๋งˆ์ง€๋ง‰์— 5๋ฅผ ๋”ํ•œ๋‹ค.
    System.out.println(Arrays.stream(arr).reduce(100000, Integer::sum));
    System.out.println(list.stream().reduce(500000, Integer::sum));

    // ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  "avenger : "๋ฅผ ๋ถ™์ธ๋‹ค. 
    System.out.println(list2.stream().reduce("avengers : ", String::concat));

    ๋ฐ˜ํ™˜๐Ÿ˜ƒ

    ์œ„์—์„œ ๊ฐ€๊ณตํ•œ ๊ฐ’์„ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

    ๊ฐ’์ด ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด get(), getAsInt() ๋“ฑ์œผ๋กœ ๊ฐ€์ ธ์˜ด

    ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ฌ๋ ค๋ฉด ๋์— .toArray();

    ๋‚˜๋จธ์ง€ ์ปฌ๋ ‰์…˜ ํ˜•ํƒœ๋Š” .collect(Collectors.toList()); ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ณ 

    list๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฑธ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์œผ๋ฉด Collectors.toList()๋ฅผ toSet(), toMap() ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด ๋จ

    ๊ทธ ์™ธ์˜ ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜ ๊ฐฏ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์•„๋ž˜ ๋ฐ˜ํ™˜ ์˜ˆ์ œ์— ์ ์—ˆ๋‹ค.

    Long cnt = Arrays.stream(arr).boxed().sorted().collect(Collectors.counting());

     

    ์•„๋ž˜์ฒ˜๋Ÿผ ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ตฌ๋ถ„์ž๋กœ ๋ถ™์—ฌ์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Œ

    System.out.println(Arrays.stream(strArr).collect(Collectors.joining("|")));

    ๋ฐ˜ํ™˜ ์˜ˆ์ œ

    package java_test.dev.java;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.function.Function;
    import java.util.stream.Collectors;
    
    // stream ๋ฐ˜ํ™˜ ์˜ˆ์ œ
    public class Test1 {
    public static void main(String[] args) {
    int[] arr = {10, 122, 10, 30, 2, 30, 31, 32, 33, 100, 1};
    List<Integer> list = new ArrayList<>();
    list.add(3);
    list.add(4);
    list.add(1);
    list.add(3);
    list.add(4);
    list.add(40);
    list.add(100);
    
    System.out.println(Arrays.stream(arr).boxed().distinct()); // ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „, ์ฆ‰ ๊ฐ€๊ณต๋งŒ ํ•œ ์ƒํƒœ
    System.out.println(list.stream().max(Integer::compare)); // ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „, ์ฆ‰ ๊ฐ€๊ณต๋งŒ ํ•œ ์ƒํƒœ
    
    int[] arr2 = Arrays.stream(arr).distinct().toArray(); // ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
    for (int i : arr2) {System.out.println(i);}
    System.out.println("=============================================================");
    
    List<Integer> list2 = Arrays.stream(arr).boxed().distinct().collect(Collectors.toList());
    list2.forEach(val -> System.out.println(val));
    System.out.println("=============================================================");
    
    int val2 = list.stream().max(Integer::compare).get(); // ์ตœ๋Œ€๊ฐ’ ํ•˜๋‚˜ ๋ฐ˜ํ™˜
    System.out.println("val2 : " + val2);
    System.out.println("=============================================================");
    long cnt = list.stream().collect(Collectors.counting()); // ํ•ด๋‹นํ•˜๋Š” ๊ฐฏ์ˆ˜ ๋ฐ˜ํ™˜
    System.out.println("cnt : " + cnt);
    // ๋ฌธ์ž์—ด ๋ฐฐ์—ด ์„ ์–ธ
    String[] strArr = {"10", "20", "30"};
    System.out.println("=============================================================");
    // ์ปฌ๋ ‰์…˜ ๋‚ด ๋ชจ๋“  ๊ฐ’์„ |๋ฅผ ๋ถ™์—ฌ์„œ ๋ฐ˜ํ™˜ | ์—†์ด ๋ถ™์—ฌ์ค„๋ ค๋ฉด ""๋กœ ๋ณ€๊ฒฝ
    System.out.println(Arrays.stream(strArr).collect(Collectors.joining("|")));
    System.out.println("=============================================================");
    
    Double val4 = Arrays.stream(strArr) // Int ํ˜•ํƒœ๋กœ ํ‰๊ท ๊ฐ’ ๋ฐ˜ํ™˜ (๋ฐฐ์—ด์ด String์ผ ๊ฒฝ์šฐ)
    .collect(Collectors.averagingInt(val -> Integer.parseInt(val)));	
    Double val5 = Arrays.stream(strArr) // Double ํ˜•ํƒœ๋กœ ํ‰๊ท ๊ฐ’ ๋ฐ˜ํ™˜(๋ฐฐ์—ด์ด String์ผ ๊ฒฝ์šฐ)
    .collect(Collectors.averagingDouble(val -> Double.parseDouble(val)));
    Double val6 = Arrays.stream(strArr) // Long ํ˜•ํƒœ๋กœ ํ‰๊ท ๊ฐ’ ๋ฐ˜ํ™˜(๋ฐฐ์—ด์ด String์ผ ๊ฒฝ์šฐ)
    .collect(Collectors.averagingLong(val -> Long.parseLong(val)));
    System.out.println("val4 : " + val4); 
    System.out.println("val5 : " + val5);
    System.out.println("val6 : " + val6); // ๊ฐ’ ํ™•์ธ
    System.out.println("=============================================================");
    
    String[] getGroupParti = {"hulk", "ironMan", "loki", "thor", "hulk", "hulk", "hulk", "hulk"};
    // ์ด๋ฆ„, ๊ฐฏ์ˆ˜๋กœ groupingํ•จ(์˜ค๋ผํด์—์„œ group byํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋…)
    Map<String, Long> map = Arrays.stream(getGroupParti)
                        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    System.out.println("hulk : " + map.get("hulk")); // ๊ฒฐ๊ณผ : hulk : 5(hulk๊ฐ€ 5๊ฐœ๋‹ˆ๊นŒ)
    System.out.println("=============================================================");
    
    // ์กฐ๊ฑด์— ๋งž์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false์˜ list ํ˜•ํƒœ๋กœ ๋‹ด์•„์คŒ
    Map<Boolean, List<String>> map2 = Arrays.stream(getGroupParti)
        .collect(Collectors.partitioningBy(val -> val == "hulk"));
    System.out.println(map2.get(true));	// ๊ฒฐ๊ณผ : [hulk,hulk,hulk,hulk,hulk]
    }
    }

     

    ๊ฒฐ๊ณผ

    java.util.stream.DistinctOps$1@e9e54c2
    Optional[100]
    10
    122
    30
    2
    31
    32
    33
    100
    1
    =============================================================
    10
    122
    30
    2
    31
    32
    33
    100
    1
    =============================================================
    val2 : 100
    =============================================================
    cnt : 7
    =============================================================
    10|20|30
    =============================================================
    val4 : 20.0
    val5 : 20.0
    val6 : 20.0
    =============================================================
    hulk : 5
    =============================================================
    [hulk, hulk, hulk, hulk, hulk]

     

    ๋งˆ๋ฌด๋ฆฌ๐Ÿฅฑ


    stream์˜ ์žฅ์ ๐Ÿค—

    1. ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•จ

    2. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง

    3. ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง


    stream์˜ ๋‹จ์ ๐Ÿ˜‘

    1. ๋””๋ฒ„๊น…์ด ํž˜๋“ฌ

    2. ์žฌํ™œ์šฉ ๋ถˆ๊ฐ€๋Šฅ

    3. ์†๋„๊ฐ€ ๋А๋ฆผ


    ์žฅ๋‹จ์ด ์žˆ์œผ๋‹ˆ ์ ์žฌ์ ์†Œ์— ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋Š”๊ฒŒ ์ค‘์š”ํ•  ๋“ฏ ์‹ถ๋‹ค.

    ์ ˆ๋Œ€ ์™ธ์šธ ํ•„์š”๋Š” ์—†๊ณ  ์ดํ•ด๋ฅผ ํ•˜๊ณ  ๊ทธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‚˜์ค‘์— ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    ์—ญ์‹œ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ธฐ๋กํ•˜๋Š”๊ฒŒ ๋” ๊ณต๋ถ€๊ฐ€ ๋˜๋Š” ๋“ฏ ์‹ถ๊ณ  ์‹ค์ œ๋กœ ์ฝ”๋”ฉํ•ด๋ณด๊ณ  ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๊ธฐ์กด๋ณด๋‹จ ๋งŽ์ด ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค.

    ์ฝ”๋”ฉํ•˜๊ณ  ๊ฒฐ๊ณผ ๋ณด๊ณ  ์ดํ•ดํ•˜๊ณ  ๊ธ€ ์ ๋Š” ์‹œ๊ฐ„ ํ† ํƒˆ ๋Œ€๋žต 1์‹œ๊ฐ„ ๋„˜๊ฒŒ ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค.๐Ÿ˜ฅ

    ์ฐธ์กฐ : Wakestand Island, 2020.12.6, https://wakestand.tistory.com/419, https://wakestand.tistory.com/418

     

    ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) ์˜ˆ์ œ๋ถ€ํ„ฐ ์‚ฌ์šฉ๋ฒ•๊นŒ์ง€ ์ •๋ฆฌ

    ์ž๋ฐ”์—์„œ ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์—„์ฒญ๋‚˜๊ฒŒ ์–ด๋ ค์šด ๊ธฐ์ˆ ์ธ ์ค„ ์•Œ๊ณ  ์‹œ์ž‘๋„ ์ „์— ํฌ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ์ŠคํŠธ๋ฆผ์€ ์—„์ฒญ ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์šฉํ•œ ๊ธฐ์ˆ ์ด๋‹ค ๋‹ค๋งŒ ์„ค๋ช…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‰ฌ์šด ๊ฑธ ๋„ˆ๋ฌด ์–ด๋ ต

    wakestand.tistory.com

    ๋Œ“๊ธ€