코딩하는 털보

ITEM 45 스트림 본문

Book/이펙티브 자바

ITEM 45 스트림

이정인 2025. 5. 2. 22:29
package me.rockintuna.effectivejava.item;

import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

/*
스트림은 주의해서 사용하라
 */
public class Item45 {

    /*
    스트림 : 원소의 시퀀스
    스트림 파이프라인 : 원소들로 수행하는 연산 단계

    스트림 파이프라인의 단계
    소스 스트림 - (중간 연산) - 종단 연산
    종단 연사이 없는 스트림은 아무 작업도 하지 않는다.

    스트림은 잘 쓰면 프로그램을 짧고 깔끔하게 만들 수 있지만,
    그렇다고 스트림을 너무 과용하면 프로그램이 읽거나 유지보수하기 어려워진다.
    모든 반복문을 스트림으로 변경하지는 않아도 되니, 가독성이 더 좋은 경우에만 스트림으로 변환하자.
     */

    /*
    스트림 주의사항
     */

    //도우미 메서드를 활용하는 것은 스트림을 깔끔하게 만드는 것에 도움이 된다.

    //스트림은 원소로 기본 타입 int, long, double만 지원한다.
    //char는 지원하지 않으며
    //String의 chars() 메서드에서 반환하는 스트림의 원소는 int이다.
    //char 값을 처리할 때는 스트림을 삼가는 편이 좋다.
    public static void main(String[] args) {
        IntStream intStream = IntStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        LongStream longStream = LongStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        DoubleStream doubleStream = DoubleStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        IntStream chars = "Lee JeongIn".chars();
    }

    /*
    스트림은 함수 객체로 처리 표현
    반복문은 코드 블록으로 처리 표현

    함수 객체로는 불가능한 것들
    - 범위 안의 지역변수를 읽고 수정할 수 없다. (final or 사실상 final인 변수만 읽을 수 있고 수정은 불가능)
    - return, break, continue 사용 불가능
    - 코드 블록은 메서드 선언에 명시된 검사 예외를 던질 수 있음

    스트림이 잘 맞는 경우
    - 원소들의 시퀀스를 일관되게 변환
    - 원소들의 시컨스를 필터링
    - 원소들의 시퀀스를 하나의 연산을 사용해 결합
    - 원소들의 시퀀스를 컬렉션에 모은다.
    - 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다.

    이전 단계의 원소가 필요한 코드의 경우, 스트림과는 어울리지 않는다.

    스트림 사용 팁
    - 스트림을 반환하는 메서드 이름은 원소의 복수 명사로 (ex) primes
     */
}
Comments