ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트림
    JAVA/스트림 2023. 8. 8. 20:54

    스트림은 데이터를 추상화해서 데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 하는 기능이다.

     

    스트림은 데이터 소스를 변경하지 않고 읽기만 할 뿐이며 일회용으로 사용된다.

     

     

    스트림의 과정

    1. 스트림 생성

    2. 중간 연산

    3. 최종 연산

     

     

     

             데이터 소스                    -------->                         중간 연산                          -------->                         최종 연산                        컬렉션, 배열 등                                                     n번 가능                                                              1번만 가능

     

     

    중간 연산 - 연산결과가 스트림인 연산. 반복적으로 n번 적용 가능

    최종 연산 - 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능(스트림의 요소를 소모)

     

    stream.distinct().limit(5).sorted().forEach(System.out::println)

    여기서 distinct(), limit(5), sorted() 등의 연산이 중간연산이고, forEach(System.out::println)이 최종 연산이다.

     

     

    String[] strArr = { "aa", "bbb", "cc", "ddd", "ee" };
    Stream<String> stream = Stream.of(strArr);
    Stream<String> filterdStream = stream.filter(); // 걸러내기 (중간 연산)
    Stream<String> distinctedStream = stream.distinct(); // 중복제거 (중간 연산)
    Stream<String> sortedStream = stream.sort();    // 정렬 (중간 연산)
    Stream<String> limitedStream = stream.limit(5); // 자르기 (중간 연산)
    
    int total = stream.count() // 요소 개수 세기 (최종 연산)

    스트림 선언 이후의 4줄은 전부 중간 연산이기 때문에 여러 번 반복해도 상관이 없다. 하지만 마지막의 stream.count()는 최종 연산이기 때문에 이 연산을 진행 후에는 stream이 닫히게 되어서 사용할 수 없게 된다.

     

     

     

    스트림 특징

    1. 데이터를 읽기만할 뿐 변경하지 않는다.

    2. 스트림은 일회용이다. (필요하면 다시 스트림을 생성해야 함)

    3. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산

     

     

     

    1. 데이터를 읽기만할 뿐 변경하지 않는다.

    List<Integer> list = Array.asList(3,1,5,4,2);
    List<Integer> sortedList = list.stream().sorted()
                          .collect(Collectors.toList());
    
    System.out.println(list);        // [3, 1, 5, 4, 2]
    System.out.println(sortedList);  // [1, 2, 3, 4, 5]

    list.stream().sorted().collect(Collectors.toLists())를 통해 list를 정렬한 다음 Collectors.toList()에 따라 정렬된 값을 sortedList에 저장한다.

     

    이 때 아래의 출력값을 통해 알 수 있겠지만 list 원본 자체는 정렬이 되지 않았고, 스트림의 반환값을 통해 새로 저장된 sortedList만 정렬된 것을 알 수 있다.

     

     

     

     

    2. 스트림은 일회용이다. (필요하면 다시 스트림을 생성해야 함)

    strStream.forEach(System.out::println);   // 모든 요소를 화면에 출력 (최종연산)
    int numOfStr = strStream.count();         // 스트림이 이미 닫혀서 에러

     

     

     

    3. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산

    IntStream intStream = new Random().ints(1, 46);   // 1 ~ 45번의 무한 스트림
    intStream.distinct().limit(6).sorted()            // 중간 연산
             .forEach(i -> System.out.println(i+",")  // 최종 연산

    무한 스트림인데 중복제거를 한 다는 것이 이상하지만 중간 연산이 바로 실행되는 것이 아니라 지연 연산으로 인해서 필요할 때에 중복제거 후 6개만 잘라서 저장한다는 특징이 있다.

     

     

     

    'JAVA > 스트림' 카테고리의 다른 글

    collect()와 Collectors  (0) 2023.08.09
    Optinal  (0) 2023.08.09
    스트림의 연산 - 최종 연산  (0) 2023.08.08
    스트림의 연산 - 중간 연산  (0) 2023.08.08
    스트림 만들기  (0) 2023.08.08
Designed by Tistory.