1 분 소요

스트림이란

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

데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과,

코드의 재 사용성이 높아 진다는 것을 의미한다.

  • 스트림은 데이터 소스를 변경하지 않는다.
  • 스트림은 일회용이다. (Iterator 처럼 일회용)
  • 스트림은 작업을 내부 반복으로 처리한다

스트림의 연산

스트림이 제공하는 다양한 연산을 이용해서 복잡한 작업들을 간단히 처리할 수 있다.

  • 중간연산 : 연산 결과가 스트림인 연산, 스트림에 연속해서 중간 연산 할 수 있음
  • 최종연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 단 한번만 가

스트림 생성

  • 배열

    String[] array = new String[]{"a", "b", "c"};
    Stream<String> stream1 = Arrays.stream(array);
    Stream<String> stream2 = Arrays.stream(array, 1, 3); 
    

    Array.stream에 인자로 배열을 입력하면 배열을 순회하는 스트림 객체를 만들 수 있으며, 배열 시작과 종료

    인덱스를 주면 일부는 순회하는 객체를 만들 수도 있음.

  • 빌더

    String<String> stream = Stream<String>builder()
                              .add("Apple")
                              .add("Banana")
                              .add("Melon")
                              .build();
      
    

    배열이나 컬렉션이 아닌 직접 값을 입력해서 스트림 객체를 생성하는 방법

  • Generator

    public static<T> Stream<T> generate(Supplier<T> s) { ... }
      
    Stream<String> stream = Stream.generate(() -> "Hello").limit(5);
      
    

    람다 식을 이용해서 만드는 스트림 생성

  • lterator

Stream<String> stream = Stream.iterate(100, n -> n + 10).limit(5);

​ iterate() 메소드를 이용해서 수열 형태의 데이터를 생성

스트림 데이터 가공 (중간연산)

  • Filter , dinstinct

    distinct()는 스트림에서 중복된 요소들을 제거하고 filter는 주어진 조건에 맞지 않는 요소를 걸러낸다

  • Map

​ 스트림에서 뽑아져 나오는 데이터에 변경을 가해 준다

Stream<Integer> stream = IntStream.range(1, 10).boxed();
stream.filter(v -> ((v % 2) == 0)) // 짝수 걸러내기
            .map(v -> v * 10) // 걸러진 값 10씩 곱하기
            .forEach(System.out::println);
  • flatMap

​ flatmap 메소드 인자를 받는 람다 는 리턴 타입 Stream이다. 즉, 새로운 스트림 생성해서 리턴 하는 람다를 인자로 받는다.

List<List<String>> list = Arrays.asLists(Arrays.asList("A", "B", "C"),
                                        Arrays.asList("a", "b", "c"));
List<String> flatList = list.stream()
                            .flatMap(Collection::stream)
                            .collect(Collectors.toList()); << 최종연산 값을 변경하여 또다른 컬랙션 생성
// ["A", "B", "C", "a", "b", "c"]

이외 나머지 중간 연산은 아래 표를 참고하

image

스트림 결과 생성(최종연산)

image

  • 요소의 출력 : forEach()
  • 요소의 소모 : reduce()
  • 요소의 검색 : findFirst(), findAny()
  • 요소의 검사 : anyMatch(), allMatch(), noneMatch()
  • 요소의 통계 : count(), min(), max()
  • 요소의 연산 : sum(), average()
  • 요소의 수집 : collect()

태그:

카테고리:

업데이트: