Today
-
Yesterday
-
Total
-
  • Stream_1: 소개
    Language/Java 2023. 11. 25. 00:01

    1

    데이터 소스를 추상화하고, 데이터를 다루는 데 자주 사용되는 메서드들을 정의해 놓은 클래스.

     

    데이터 소스를 추상화하였다는 것은
    데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 되었음과 코드의 재사용성이 높아졌음을 의미한다.

     

    배열이나 컬렉션 뿐만 아니라, 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있다.

     

    String[] strArr = new String[]{"c", "aaa", "fff", "bb"};
    List<String> strList = Arrays.asList(strArr);
    
    // 🔻 스트림 생성
    Stream<String> strStream1 = strList.stream();
    Stream<String> strStream2 = Arrays.stream(strArr);
    
    // int 배열 스트림으로 만들기
    int[] numbers = {1, 2, 3, 4, 5};
    IntStream intStream = Arrays.stream(numbers);

     

    2.

    스트림은 데이터 소스를 변경시키지 않는다.

     

    스트림은 일회용이라 최종 연산을 실행하고 나면 종료됨으로 재사용이 불가능하다.

     

    // 데이터 소스에 결과 반영하기
    strStream2 = Arrays.stream(strArr);
    List<String> sortedList = strStream2.sorted().toList();
    System.out.println(sortedList);

     

    3.

    스트림이 제공하는 연산은 중간 연산최종 연산이 있다.

     

    중간 연산은 연산 결과를 스트림으로 반환하기 때문에, 중간 연산을 계속 이어서 할 수 있다.

     

    최종 연산은 연산 결과 스트림을 종료하고 void나 다른 값을 반환하기 때문에 연산을 이어서 할 수 없다.

     

    최종 연산이 수행되기 전에는 중간 연산이 수행되지 않는다.

     

    중간 연산자 _ 핵심 : map() , flatMap()

    distinct()     // 중복 제거
    filter()    // 조건에 맞지 않는 요소 제외
    limit()        // 일부를 잘라냄
    skip()        // 일부를 건너뜀
    peek()        // 요소에 작업 수행
    sorted()    // 료소를 정렬
    sorted(Comparator<T> c) // 요소를 사용자 정렬
    
    /*    🔻변환 연산         */
    // 스트림 요소를 반환 : 변환된 요소를 포함하여 원래 스트림과 같은 크기의 새로운 스트림을 반환
    map() 
    mapToDouble()         
    mapToInt()             
    mapToLong()             
    
    // 스트림 요소를 반환 : 반환된 여러 스트림을 하나의 스트림으로 만들어줌
    flatMap() 
    flatMapToDouble()    
    flatMapToInt()        
    flatMapToLong()

     

    최종 연산자 _ 핵심 : reduce() , collect()

    forEach()         // 순서대로 작업 _ 병렬 처리 작업에서는 순서를 보장 X
    forEachOrdered() // 순서대로 작업 _ 병렬 처리 작업에서 출력 순서를 보장 O
    
    count()    // 요소의 개수 반환
    
    max()    // 최대값 반환
    min()    // 최소값 반환
    
    findAny()    // 스트림 요소를 아무거나 하나 반환
    findFirst()    // 스트림에서 첫번째 요소 하나 반환
    
    allMatch()    // 주어진 조건을 모든 요소가 만족시키는지 확인
    anyMatch()    // 주어진 조건을 만족하는 요소가 하나라도 있는지 확인
    noneMatch()    // 주어진 조건을 만족하는 요소가 없는지 확인
    
    toArray() // 스트림의 모든 요소를 배열로 반환
    
    reduce() // 스트림의 요소를 하나씩 줄여가면서 계산
    
    collect() // 스트림의 요소를 수집. 요소를 그룹화 하거나, 분할한 결과를 컬렉션에 담아 반환하는데 사용

     

    4.

    요소의 타입이 T인 스트림은 기본적으로 Stream이지만,
    오토박싱 & 언박싱으로 인한 비효율을 줄이기 위해

     

    데이터 소스의 요소를 기본형으로 다루는 스트림으로 IntStream, DoubleStream, LongStream이 제공된다.

     

    일반적으로 Stream 대신 IntStream을 쓰는 것이 더 효율적.

     

    IntStream에는 int 타입의 값으로 작업하는데 유용한 메서드들이 포함되어 있다.

     

    5.

    스트림으로 데이터를 다룰 때의 장점으로 쉬운 병렬처리를 꼽을 수 있다.

     

    병렬 스트림은 fork&join 프레임워크를 사용하여 자동적으로 연산을 병렬로 수행한다.

     

    병렬 처리를 하려면 스트림에 parallel() 메서드를 호출해 주면 된다.

    parallel() 호출을 취소하려면 sequential() 메서드를 호출해 주면 된다.

     

    스트림은 기본적으로 병렬스트림이 아니므로 sequential() 메서드를 호출할 필요가 없다.

    'Language > Java' 카테고리의 다른 글

    SQLite  (0) 2023.11.25
    Stream_3: 중간 연산자  (0) 2023.11.25
    Stream_2: 시작 연산자  (0) 2023.11.25
    자바의 정석 3판 _ 연습문제 02~03 오답 정리  (0) 2023.11.23
    코딩테스트용 프로젝트 템플릿!! 😆  (0) 2023.11.21

Designed by Tistory / Custom by 얼거스