Stream API

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {

    static class A {
        int x, y;

        public A(int x, int y) {
            this.x = x;
            this.y = y;
        }

    }

    public static void main(String[] args) {

        //Stream API ์ด์šฉํ•œ ๊ตฌํ˜„
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        //์ค‘๊ฐ„ ์ฒ˜๋ฆฌ mapToInt -> IntStream
        //i๋ผ๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•ด i๋ผ๋Š” ์ถœ๋ ฅ์œผ๋กœ ์ „ํ™˜
        //max, OptionalInt -> ์ตœ์ข…์ฒ˜๋ฆฌ
        //๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ ๋•Œ๋ฌธ์— null ๋•Œ๋ฌธ์— Optional์ฒ˜๋ฆฌ
        //getAsInt -> Optional์ฒ˜๋ฆฌ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

        int maxVal = list.stream().mapToInt(i -> i).max().getAsInt();
        System.out.println("maxVal : " + maxVal);

        //์ŠคํŠธ๋ฆผ์˜ ํŠน์ง•
        //์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
        //์ŠคํŠธ๋ฆผ์€ ์ผํšŒ์šฉ์ด๋‹ค.
        //๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
        //์ฒด์ด๋‹์œผ๋กœ ์ž‘์—…

        //์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์˜ˆ์‹œ
        //๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
        //๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜

        //List<Integer> -> Integer[]
        //Integer = Wrapping class
        //list.stream(). -> Stream<Integer>
        //Integer[]::new) ํ•ญ์ƒ ๋ฐฐ์—ด์˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค˜์•ผํ•จ.
        Integer[] array = list.stream().toArray(Integer[]::new);


        //List<Integer> -> int[]
        //list.stream() -> Stream<Integer>
        //mapToInt -> IntStream
        //toArray -> ์ด๋ฏธ int[]๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฑธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ์ƒ์„ฑ์ž ํ•„์š”X
        int[] intArray = list.stream().mapToInt(i -> i).toArray();


        //int[] -> List<Integer>
        //Arrays.stream(intArray) -> IntStream
        //boxed int๊ฐ€ Integer๊ฐ€ ๋˜๋Š”๊ฒƒ ๋ฐ•์‹ฑ ์˜๋ฏธ. -> stream<Integer>
        //collect ๋ฐ˜ํ™˜ ๋ฐ›์„๋•Œ ํŠน๋ณ„ํ•œ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ ๋ฐ›๊ธฐ์œ„ํ•œ ์ž‘์—…
        //๋ฐฐ์—ด์„ ํŠน์ •ํ•œ ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ คํ• ๋•Œ
        //Collectors.toList() -> List<Integer>๋กœ ๋ฐ˜ํ™˜๋จ.

        //java 8.
        List<Integer> list1 = Arrays.stream(intArray).boxed().collect(Collectors.toList());
        //java 16์ด์ƒ
        List<Integer> list2 = Arrays.stream(intArray).boxed().toList();


        //์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋™์‹œ์— ๋ฐ˜๋ณต.
        int[] array1 = {10, 20, 30, 40};
        int[] array2 = {100, 200, 300, 400};

        System.out.println("== ๋‘ ๋ฐฐ์—ด์„ ๋™์‹œ์— ์‚ฌ์šฉ! ๋‘๋ฐฐ์—ด ๋”ํ•˜๊ธฐ ==");
        //range(0, array1.length). -> 0~array.length-1 ๋ฐ˜๋ณตํ•˜๋Š” IntStream
        //map(i -> array1[i] + array2[i]) -> ๋žŒ๋‹ค์‹์„ ์ด์šฉํ•œ ๊ธฐ๋Šฅ ์ปค์Šคํ…€
        //System.out::println -> void
        IntStream.range(0, array1.length).map(i -> array1[i] + array2[i]).forEach(System.out::println);

        //๋‘ ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉํ•˜์—ฌ A๊ฐ์ฒด ์ƒ์„ฑ
        int[] array3 = {10, 20, 30, 40};
        int[] array4 = {100, 200, 300, 400};
        //IntStream.range(0, array3.length). -> IntStream
        //boxed -> Stream<Integer>
        //map(i -> new A(array3[i], array4[i])) -> Stream<A>
        //collect(Collectors.toList()) -> List<A>

        List<A> as = IntStream.range(0, array3.length).boxed().map(i -> new A(array3[i], array4[i])).collect(Collectors.toList());
        System.out.println("== ๋‘ ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉํ•˜์—ฌ A๊ฐ์ฒด ์ƒ์„ฑ ==");
        System.out.println("List<A> : " + as);

        //์ ˆ๋Œ€๊ฐ’์ด ์ตœ๋Œ€์ธ ๊ฐ’ ์ฐพ๊ธฐ
        List<Integer> listAbs = new ArrayList<>();
        listAbs.add(-10);
        listAbs.add(40);
        listAbs.add(110);
        listAbs.add(-140);

        //istAbs.stream() -> Stream<Integer>
        //max((x, y) -> Math.abs(x) - Math.abs(y)) -> Optional<Integer>
        //(x, y) -> Math.abs(x) - Math.abs(y) -> Comperator
        //get() -> Integer
        int getMaxVal = listAbs.stream().max((x, y) -> Math.abs(x) - Math.abs(y)).get();
        System.out.println("== ์ ˆ๋Œ€๊ฐ’์ด ์ตœ๋Œ€์ธ ๊ฐ’ ์ฐพ๊ธฐ ==");
        System.out.println("getMaxVal : " + getMaxVal);
        //์ˆซ์ž๋ฅผ ์ •๋ ฌํ›„ ๋ฌธ์ž์—ด๋กœ ์ด์–ด ๋ถ™์ด๊ธฐ
        //[10, 40, 9, 15] -> [9, 10, 15, 40] -> "9101450"

        List<Integer> listConcat = new ArrayList<>();
        listConcat.add(10);
        listConcat.add(40);
        listConcat.add(9);
        listConcat.add(15);

        //listConcat.stream(). -> Stream<Integer>
        //sorted() -> Stream<Integer>
        //map(String::valueOf) -> Stream<String>
        //collect(Collectors.joining()) -> String
        //joining() -> ์‚ฌ์ด์— ๋ฌธ์ž์—ด์„ ๋ผ์›Œ์„œ ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐ

        String result = listConcat.stream().sorted().map(String::valueOf).collect(Collectors.joining());
        System.out.println("== ์ˆซ์ž๋ฅผ ์ •๋ ฌํ›„ ๋ฌธ์ž์—ด๋กœ ์ด์–ด ๋ถ™์ด๊ธฐ ==");
        System.out.println("listConcat : " + result);
    }
}
maxVal : 5
== ๋‘ ๋ฐฐ์—ด์„ ๋™์‹œ์— ์‚ฌ์šฉ! ๋‘๋ฐฐ์—ด ๋”ํ•˜๊ธฐ ==
110
220
330
440
== ๋‘ ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉํ•˜์—ฌ A๊ฐ์ฒด ์ƒ์„ฑ ==
List<A> : [Main$A@49097b5d, Main$A@6e2c634b, Main$A@37a71e93, Main$A@7e6cbb7a]
== ์ ˆ๋Œ€๊ฐ’์ด ์ตœ๋Œ€์ธ ๊ฐ’ ์ฐพ๊ธฐ ==
getMaxVal : -140
== ์ˆซ์ž๋ฅผ ์ •๋ ฌํ›„ ๋ฌธ์ž์—ด๋กœ ์ด์–ด ๋ถ™์ด๊ธฐ ==
listConcat : 9101540

Leave a comment