극동대학교\AI컴퓨터공학과\JAVA

Stream API이란.

sundori 2023. 5. 17. 15:57

목차

     

    #1 스트림 API(stream API)

    자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 흐름을 통해 다룬다고 입출력에 대해 공부할 때 배웠었다.

    그러나 Java SE 8부터 추가된 스트림 API는 이전에 배웠던 스트림과 전혀 다른 개념이라고 한다

    많은 양의 데이터를 저장하기 위해 컬렉션을 사용한다고 한다. 이러하게 저장된 데이터에  접근하려면 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성해야 했었다. 이러한 코드들의 단점은 코드의 재사용이 불가능하고 가독성이 떨어지는 문제점이 있었다.

    실제로 코드를 작성하면서 여러번의 for문 작성이 주를 이루긴 했었다. 이러한 문제를 해결하기 위해 나온 것이 스트림 API라고 한다.

    class FirstJava {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<>();
            list.add(1); // 0번 원소의 값은 1
            list.add(2); // 1번 원소의 값은 2
            list.add(3); // 2번 원소의 값은 3
            list.add(4); // 3번 원소의 값은 4
            for(int i = 0; i < list.size(); i++)
                System.out.println(list.get(i));
    
            System.out.println();
    
            list.forEach(System.out::println);
        }
    }
    --------------------------------------------
    1 // 반복문 사용
    2
    3
    4
    
    1 // 최종 연산자 사용
    2
    3
    4

    #1-1 스트림 API의 특징

    • 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리 내부 반복(internal iteration)을 통해 작업을 수행합니다.
    • 스트림은 재사용이 가능한 컬렉션과는 달리 단 한 번만 사용할 수 있습니다.
    • 스트림은 원본 데이터를 변경하지 않습니다.
    • 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화합니다.
    • 스트림은 parallelStream() 메소드를 통한 손쉬운 병렬 처리를 지원합니다. 

    #1-2 스트림 API의 동작 흐름

    쉽게 말하자면 데이터가 흐르고 있는데 이 데이터들을 잡아 상자에 담는 행위 map(중간연산자) 그리고 상자를 다른 곳으로 운반하는 collect(최종 연산자)라고 보면된다. 위 데이터 흐름이라 했는데 저 흐름 속에서 내가 원하는 데이터를 잡아다가 상자에 담는 것이다.

    스트림의 생성 -> 스트림의 중개 연산(스트림의 변환) -> 스트림의 최종 연산(스트림의 사용)

    데이터.Stream생성().중개연산()...종료연산(); 구조로...

    중개연산

    • 연산을 계속 추가할  수 있다.
    • stream을 반환하며 종료 연산이 오기 전에는 실행되지 않는다.
    • 매핑, 필터링, 정렬 등을 수행

    종료연산

    • 더 이상 연산을 연결할 수 없다.
    • stream을 반환하지 않는다.
    • 반복, 카운팅, 평균, 총합 등의 집계 처리 수행.
    class FirstJava {
        public static void main(String[] args) {
            List<Integer> list = new LinkedList<>();
            list.add(1); // ex) 0번지 원소의 값은 1  -> 번지수는 쉽게 이해하기 위해서 임의로 적어놨다.
            list.add(2); // ex) 1번지 원소의 값은 2
            list.add(3); // ex) 2번지 원소의 값은 3
            list.add(4); // ex) 3번지 원소의 값은 4
            list.stream().skip(0).map( (e) -> { // 람다식 이용
                System.out.println(e);
                return "반환 성공";
            }).forEach(System.out::println);
        }
    }
    ----------------------------------------------
    1 반환 성공
    2 반환 성공
    3 반환 성공
    4 반환 성공
    list.stream().skip(2).map( (e) -> {
                System.out.print(e + " ");
                return "반환 성공";
            }).forEach(System.out::println);
    -----------------------------------------
    3 반환 성공
    4 반환 성공

     

    #1-3 예제

    숫자 정렬

    Arrays를 사용하자. 

    class FirstJava { // 오름차순
        public static void main(String[] args) {
            int[] ints = {4, 3, 2, 1};
            System.out.println(Arrays.toString(ints));
            Arrays.sort(ints);
            System.out.print(Arrays.toString(ints));
        }
    } // 그냥 Arrays 사용하자..
    -------------------------------------
    [4, 3, 2, 1]
    [1, 2, 3, 4]
    class FirstJava { // 내림차순
        public static void main(String[] args) {
            int[] ints = {4, 3, 2, 1};
            List<String> list = Arrays.asList(Arrays.toString(ints));
            Arrays.sort(ints);
            System.out.print(Arrays.toString(ints));
            System.out.println();
            list.stream().sorted(Collections.reverseOrder()).forEach(System.out::print);
        }
    }
    --------------------------------------
    [1, 2, 3, 4]
    [4, 3, 2, 1]

    문자 정렬

    import java.util.*;
    
    class FirstJava {
        public static void main(String[] args) {
            String[] string = {"D", "C", "B", "A"};
            List<String> list = Arrays.asList(string);
            list.forEach(System.out::print);
            System.out.println();
            list.stream().sorted().forEach(System.out::print);
        }
    }
    ----------------------------------------------------------
    DCBA
    ABCD

    추후 더 공부해서 글을 이어나갈 예정이다.

    '극동대학교\AI컴퓨터공학과\JAVA' 카테고리의 다른 글

    4) 자바 8  (0) 2023.12.23
    3) 자바 입출력문  (0) 2023.12.23
    2) 자바 프로그램  (0) 2023.12.20
    1) 자바 개념  (0) 2023.12.20
    Arrays.  (0) 2023.05.17