Java

스트림

move2 2022. 11. 17. 15:58

스트림은 데이터의 흐름 이라고 한다.

컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.

스트림을 활용해서 필터링,데이터 변경, 다른 타입이나 자료구조로 변환 등을 할 수 있다.

스트림은 데이터 소스를 변경하지 않고, 작업을 내부적으로 반복 처리하며, 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용이 불가능하다. 그러므로 필요할 경우 재생성을 해야한다는 특징을 가지고 있다.

 

1.스트림 생성

스트림을 이용하기 위해 먼저 스트림을 생성해야한다.

Stream<T> Collection.stream() 을 이용하여 해당하는 컬렉션을 기반으로하는 스트림을 생성할 수 있다.

2.중간 연산

중간 단계로써 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공을 해준다.

map(변환) / sorted(정렬) / skip(스트림 자르기) / limit(스트림 자르기) 등이 있다.

3.최종 연산

스트림의 요소를 소모해서 결과를 반환하는 단계이다. 최종 연산 이후에는 스트림이 닫히게 되고 더 이상 사용할 수 없다.

최종 연산의 결과값은 단일 값일 수도 있으며 배열 혹은 컬렉션일 수도 있다.

collect()를 이용해서 다른 콜렉션으로 바꾸는 것, reduce를 이용해서 incremental calculation하는 것도 가장 많이 쓰이는 패턴이다.

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("서울");
        list.add("부산");
        list.add("속초");
        list.add("서울");

        System.out.println(list);
        List<String> result = list.stream() // 스트림 생성
                .limit(2) //중간 연산
                .collect(Collectors.toList()); // 최종 연산
        System.out.println(result);

        System.out.println("list -> transformation -> set");
        Set<String> set = list.stream()
                .filter("서울"::equals)
                .collect(Collectors.toSet());
        set.forEach(System.out::println);
    }
}

위 예제의 result에서는  .stream()으로 스트림을 생성하였다. 그리고.limit 으로 중간연산을 한뒤 .collect()를 이용하여 다른 콜렉션으로 바꿔줌으로써 최종연산을 하고, 스트림을 닫았다. 값은 limit(2)가 되어 리스트의 형태로 서울, 부산 만 나오게 된다. 그 아래의 set에서는 set의 형태로 서울만 출력된다.

예제