Java

Stream

voider 2020. 9. 10. 13:14

Stream

스트림이란, 데이터 소스가 무엇이든 같은 방식으로 다룰 수 있게 추상화한 것이다.

특징

  • 데이터 소스를 변경하지 않는다. Read only

  • 재사용 불가

  • 작업을 내부 반복으로 처리
    반복문을 메서드 내부로 숨겨서 처리한다. forEach()

    void forEach(Consumer<? super T> acton) {
      Objects.requireNonNull(action);
    
      for(T t : src) {
          action.accept(T);
      }
    }

스트림 연산

  • 중간 연산
    스트림을 반환하는 연산. 연속해서 다른 연산 가능.

  • 최종 연산
    반환하는 타입이 스트림이 아닌 연산.

중간연산

중간연산 설명
Stream<T> distinct() 중복 제거
Stream<T> filter(Predicate<T> predicate) 조건에 맞지 않는 요소 제외
Stream<T> limit(long maxSize) 스트림의 일부를 잘라낸다.
Stream<T> skip(long n) 스트림의 일부를 건너뛴다.
Stream<T> peek(Consumer<T> action) 스트림의 요소에 작업 수행
Stream<T> sorted()
Stream<T>sorted(Comparator<T> comparator)
스트림의 요소를 정렬
Stream<R> map(Function<T,R> mapper)
DoubleStream mapToDouble(ToDoubleFunction<T> mapper)
IntStream mapToInt(ToIntFunction<T> mppaer)
LongStream mapToLong(ToLongFunction<T> mapper)

Stream<R> flatMap(Function<T,Stream<R>> mapper)
DoubleStream flatMapToDouble(Function<T, DoubleStream> m)
IntStream flatMapToInt(Function<T, IntStream> m)
LongStream flatMapToLong(Function<T,LongStream> m)
스트림의 요소를 변환한다.

최종 연산

최종 연산 설명
void forEach(Consumer <? super T> action)
void forEachOrderd(Consumer<? super T> action)
각 요소에 지정된 작업 수행
long count() 스트림 요소의 개수 반환
Optional<T> max(Comparator<? super T> comparator)
Optional<T> min (Comparator<? super T> comparator)
스트림 최대, 최소값 반환
Optional<T> findAny() //아무거나 하나
Optional<T> findFirst() //첫번째 요소
요소 하나를 반환
boolean allMatch(Predicate<T> p) //모두 만족
boolean anyMatch(Predicate<T> p) //하나라도 만족
boolean noneMatch(Predicate<> p) //모두 만족하지 않음
주어진 조건을 모든 요소가 만족하는지, 만족하지 않는지 확인
Object[] toArray()
A[] toArray(IntFunction<A[]> generator)
스트림의 모든 요소를 배열로 반환
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> acculmulator)
U reduce(U identity, BiFunction<U,T,U> accumulator, BinaryOperator combiner)
스트림 요소를 하나씩 줄여가면서(reducing) 계산한다.
R collect (Collect<T,A,R> collector)
R collect (Supplier<R> supplier, Biconsumer<R,T> accumulator, BiConsumer<R,R> combiner)
스트림의 요소를 수집한다. 요소를 그룹화하거나 분할한 결과를 컬렉션에 담아 반환할 때 사용.

기본형을 다루는 스트림

  • IntStream
  • LongStream
  • DoubleStream

오토박싱, 언박싱을 사용하지 않기 때문에 Stream<Interger>보다 효율적이다.


스트림 생성

  • 컬렉션 스트림 생성

      List<Integer> list = Arrays.asList(1,2,3,4,5);
      Stream<Integer> intStream = list.stream(); // Stream<T> Collection.stream()
  • 배열으로 스트림 생성

      Stream<String> strStream = Stream.of("a","b","c"); //가변인자
      Stream<String> strStream = Stream.of(new String[]{"a","b","c"});
      Stream<String> strStream = Arrays.stream(new String[]{"a","b","c"});
      Stream<String> strStream = Arrays.stream(new String[]{"a","b","c"}, 0, 3);
  • 특정 범위의 정수를 요소로 가지는 스트림 생성

      IntStream intStream = IntStream.range(1, 5);    //1,2,3,4
      IntStream intStream = IntStream.rangeClosed(1,5)// 1,2,3,4,5
  • 난수를 요소로 가지는 스트림
    IntStream - ints()
    LongStream - longs()
    DoubleStream - doubles()

      IntStream intStream = new Random().ints();    //무한 스트림
      intStream.limit(5).forEach(i -> System.out.println(i));    //5개 출력
    
      IntStream intStream = new Random().ints(5);    //크기가 5인 난수 스트림 반환

중간 연산

  • 자르기

      Stream<T> skip(long n)    //앞에서부터 n개 건너뛰기
      Stream<T> limit(long maxSize)    //maxSize이후 요소 잘라냄
    
      IntStream intStream = IntStream.rangeClosed(1, 10);    //1,2,3,4,5,6,7,8,9,10
      //앞에 3개 자르고, 사이즈는 5로 한다.
      intStream.skip(3).limit(5).forEach(i->System.out.println(i)); //4,5,6,7,8
  • 걸러내기

      Stream<T> filter(Predicate<? super T> predicate) //조건에 맞지 않는 요소 제거
      Stream<T> distinct();    //중복 제거
    

IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6);
intStream.distinct()
.filter(i -> i%2==0)
.forEach(i -> System.out.println(i)); //2,4,6

'Java' 카테고리의 다른 글

Hassing & HashFunction  (0) 2020.09.10
예외처리  (0) 2020.09.10
람다Lambda  (0) 2020.09.09
제네릭 메서드Generic Method  (0) 2020.09.09
와일드카드  (0) 2020.09.09