본문 바로가기
개인공부

Stream 정리

by 리승우 2023. 2. 26.

Stream 정의

다양한 데이터 소스(ex.컬렉션(List,Set,Map), 배열)를 표준화된 방법으로 다루기 위한 것

 

Stream 특징

1. 데이터 소스로부터 데이터를 읽기만할 뿐, 데이터 소스(원본)은 변경하지 않는다.

2. Iterator와 같이 일회용임(추후 필요하면 다시 스트림을 생성해야함)

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

4. 작업을 내부반복으로 처리한다

5. 작업을 병렬로 처리한다 (병렬스트림) -> 멀티 쓰레드로 병렬처리 (parallel() 함수로 병렬 스트림으로 전환하여 빠른 처리를 지원)

 

Stream 과정

1. 데이터 소스 Stream 요소로 변환취합

2. n번의 중간연산 과정 거침 (Stream을 이용하여 표준화된 방법으로 Stream 요소들을 기호에 맞게 진행)

3. 1번의 최종연산을 거쳐 Stream 요소를 소모하여 Stream이 아닌 것으로 최종도출

 

중간연산 대표적인 메서드

 

최종연산 대표적인 메서드

> Stream의 마지막에 반복 처리를 실시하고 싶은 경우

 

> Stream의 요소결과를 정리해서 추출하고 싶은 경우

 

> 결과를 하나만 추출하고 싶을 경우

 

> 요소를 집계하여 결과의 수치를 반환하고 싶을 경우 (인수 주지않아도 됨)

 

활용예제 코드

import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        int[] intArr = new int[]{6, 7, 8, 9, 10};

        OptionalInt max = Arrays.stream(intArr) // 스트림 생성
                .max();// 최대값 Optional 반환
        // 출력값 : OptionalInt[10]

        long count = Arrays.stream(intArr)
                .count(); // 요소개수 반환, sum()을 이용할 경우 결과값 40
        // 출력값 : 5

        int asIntFirst = Arrays.stream(intArr)
                .findFirst()
                .getAsInt();
        // 출력값 : 6

        Arrays.stream(intArr)
                .filter(value -> value > 8) // 9이상인 숫자만 추출
                .distinct() // 중복 제거
                .limit(1)
                .boxed() // int를 Integer로 박싱
                .sorted(Comparator.comparingInt(value -> value)) // 작은 숫자순(오름차순 정렬)
                // .sorted(Comparator.reverseOrder()) 큰 숫자순 (내림차순 정렬) *아래와 동일한 역할
                // .sorted(Collections.reverseOrder()) 큰 숫자순 (내림차순 정렬) *위와 동일한 역할
                .forEach(System.out::print);
        // 출력값 : 910

        /*
        별도 예시
        Stream요소들을 Product의 이름으로 반환하여, 그 결과를 List로 반환받는 형태
        만약 List가 아닌 Set으로 받고 싶다면
        .collect(Collectors.toSet());
        사용하면됨 */
        List<String> nameList = productList.stream()
                .map(Product::getName)
                .collect(Collectors.toList());
    }
}

 

Stream vs for (그래서 우리는 뭘 써야 이득일까?)

공통 특징

1. 둘 다 다량의 데이터 처리작업에 이용

 

상이한 특징

1. for에서 할 수 있는 continue, break 로직은 Stream에서 사용할 수 없음

2. for문은 외부반복, Stream은 내부반복으로 진행됨

3. 가독성은 취향의 영역이나, stream이 대체로 가독성이 괜찮음

4. for문에 비해 stream이 디버깅하기 어려움

5. stream을 이용한 것이 병렬 처리함에 있어서 더욱 간단함

 

성능 측정 결과 (for, foreach, stream)

>  for문은 나온지 오래된만큼, stream에 비해 JVM에서 최적화가 많이 이루어져서 더 빠름.

허나, 오늘날의 하드웨어는 충분히 빠르기 때문에, 소프트웨어에서는 성능보다는 가독성에 중점을 두는 것이

더욱 합리적인 것으로 여겨지는 추세임.

 

결론

성능 면을 크게 신경쓰지말고, 때에 맞게 선별하여 쓰자

EX) 가독성이 중요하다면 stream, 반복문에 조건을 붙어야한다면 for문 등등

댓글