티스토리 뷰

자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 다섯 번째는 Stream이다.

  • 데이터를 담고 있는 저장소(컬렉션)이 아니다.
  • 연속된 데이터를 처리하는 operation의 모임이라고 생각하면 된다.
  • 스트림으로 처리하는 데이터 소스를 변경하지 않는다.
    • 즉, 어느 컬렉션에 스트림 API를 쓰더라도 컬렉션 내 데이터는 변경되지 않는다.
  • 스트림 API를 중개 오퍼레이션과 종료 오퍼레이션이 존재한다.
    • 중개 오퍼레이션이 lazy하다는 의미는 종료 오퍼레이션이 실행될 때까지 중개 오퍼레이션은 실행을 하지 않는다. ⇒ 중개 오퍼레이션은 정의만 한다고 생각하면 된다.
  • 손쉽게 병렬 처리가 가능하다.
    • 스레드를 만들고 병렬처리하는 + 컨텍스트 스위칭을 고려할 때에는 더 오래 걸릴 수 있다.
    • 엄청 방대한 데이터일 경우에만 사용하자.
    • 소스와 처리하는 데이터에 따라 다르므로 성능 체크를 한 후 사용하는 것이 제일 좋다.

중개 오퍼레이션의 lazy 예시

import java.util.*;

public class App  {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("eric");
        names.add("kwon");
        names.add("toby");
        names.add("spring");

        names.stream().map((str) -> {
            System.out.println(str);
            return str.toUpperCase();
        });

        System.out.println("==========구분자========");
    }
}

// 출력 결과
==========구분자========

위 코드에서 보다시피 종료 오퍼레이션이 없는 코드는 출력이 이루어지지 않는다.

즉, 실행이 안 된다고 볼 수 있다.

다음 코드는 종료 오퍼레이션을 추가한 코드이다.

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

public class App  {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("eric");
        names.add("kwon");
        names.add("toby");
        names.add("spring");

        List<String> namesUsedStream = names.stream().map((str) -> {
            System.out.println(str);
            return str.toUpperCase();
        }).collect(Collectors.toList());

        System.out.println("==========구분자========");

        System.out.println(namesUsedStream.toString());
    }
}

// 출력 결과
eric
kwon
toby
spring
==========구분자========
[ERIC, KWON, TOBY, SPRING]

스트림 파이프라인

  • 0개 또는 다수의 중개 오퍼레이션과 한 개의 종료 오퍼레이션으로 구성한다.
  • 스트림의 데이터 소스는 오직 종료 오퍼레이션을 실행할 때에만 처리한다.

중개 오퍼레이션

ex) filter, map, limit, skip, sorted ...

종료 오퍼레이션

ex) collect, allMatch, count, forEach, min, max ...

 

위 내용은 effective-java 아이템[45]에도 자세히 나온다.

책에서 소개하는 스트림이 아주 안성맞춤인 상황이다.

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

스트림으로 처리하기 어려운 대표적인 예는 한 데이터가 파이프라인의 여러 단계를 통과할 때 이 데이터의 각 단계에서의 값들에 동시에 접근하기는 어려운 경우이다.

 

스트림의 각 변환 단계는 함수형 인터페이스에서 언급한 순수함수여야 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함