알고리즘을 공부하면서 for문과 foreach 문을 상당히 많이 사용해 보았는데
stream 을 사용하는데 있어서 어떤 이점이 있고
어떤 차이점이 있는지에 대해서 정리해보도록 하겠습니다.
표현 방식의 차이
일반적으로 for문을 사용하다보면 조건에 맞지 않는 부분에 대해서는
continue; break; return; 을 통해서 제어가 가능하지만
람다식으로 이루어진 stream의 경우 이러한 제어가 불가능하다.
지연 방식과 디버깅
stream의 경우 내부적인 처리를 많이 하며 지연 방식을 가지고 있다.
때문에 디버깅에 있어서 for문 처럼 직관적이지 않다라는 특징을 가지고 있다.
겉으로 보았을 때는 for문 보다 stream이 대부분의 경우 가독성이 좋지만
디버깅의 경우 어려움을 겪을 수 있다.
스트림의 특징
1. 스트림은 데이터 소스로부터 데이터를 읽기만 한다.
list라는 배열을 복사해서 sorting 이라는 배열로 stream을 적용해도
원본은 변하지 않는다.
2. 스트림은 일회용이다.
이렇게 재사용을 할 경우
stream has already been operated upon or closed 라는 에러가 발생한다.
3. 최종 연산 전까지 중간 연산이 수행되지 않는다.
중간 연산 (filter, map, limit, sorted, distinct)는 서로 파이프 라인으로 연결이 되어 계산이 가능하고
최종 연산(forEach, count, collect)로 마무리를 짓는다 .
만약 스트림이 무한일 경우에도 중간 연산이 바로 시행 되는것이 아닌 최종 연산시에 시행되기 때문에
무한 스트림에도 불구하고 계산이 가능하다.
4. 병렬 처리
멀티쓰레드를 통해서 병렬처리를 한다.
병렬 스트림은 내부적으로 ForkJoinPool(업무를 Fork(분담) + Join(취합))을 한다.
쓰레드를 하나씩 분담하는 것(쓰레드풀)이 아닌 서로 처리 하다가 끝났을 때 남은 쓰레드 업무를 가져간다.
중간 연산
스트림의 중간 연산자
Stream distinct() | 중복 제거 |
Stream sorted(Comparator comparator) | 정렬 |
Stream filter(Predicate predicate) | 조건 |
Stream<T> peek(Consumer<T> action) | 스트림 요소에 추가적인 작업 (요소가 변경되지 않도록 조심할것) |
Stream limit (long maxSize) | 최대 개수 지정 |
스트림의 요소를 변환
Stream<R> flatMap(Function<T,Stream<R>> mapper) | |
Stream<R> map(Function<T,R> mapper) | |
DoubleStream mapToDouble(ToDoubleFunction<T> mapper) | |
IntStream mapToInt(ToIntFunction<T> mapper) | |
LongStream mapToLong(ToLongFunction<T> mapper) | |
DoubleStream flatMapToDouble(Function<T.DoubleStream> m) | |
IntStream flatMapToInt(Function<T, IntStream> m) | |
LongStream flatMapToLong(Function<T,LongStream> m) |
아직 사용법을 잘 모르겠어서 이것저것 실험중 ㅠㅠ
최종 연산
void forEach(Consumer action> | |
void forEachOrdered(Consumer<? super T>action) | 추가적인 요소 작업 |
long count() | 사이즈를 반환함 |
Optional min (Comparator<? super T> comparator) | 최소 반환 |
Optional max (Comparator<? super T> comparator) | 최대 반환 |
Optional findAny() | 랜덤 반환 |
Optional findFirst() | 첫 번째 요소 반환 |
boolean allMatch(Predicate<T> p) | 모두 만족한가? |
boolean anyMatch(PredicaAte<T> p ) | 아무거나 하나는 만족한가? |
boolean nonMatch(Predicate<T> p) | 아무것도 만족 안하나? |
Object[] toArray() | 배열로 반환 |
A[] toArray(IntFunction<A[]> generator) | 배열로 반환 |
하나씩 줄여가면서 연산>>reduce
Optional<T> reduce(BinaryOperator<T> accumulator) | |
T reduce (T identity, BinaryOperator<T> accumulator) | |
U reduce (U identity, BiFunction<U,T,U> accumulator, BinaryOperator<U> combiner) |
요소 수집 및 그룹화
R collect(Collector<T,A,R> collector) | |
R collect(Supplier<R> supplier, BiConsumer<R,T> accumulator, BiConsumer<R,R> combiner) |
Map (0) | 2022.10.18 |
---|---|
[체크,언체크] 예외의 활용 (0) | 2022.10.04 |
언체크-런타임 예외 (0) | 2022.10.03 |
자바의 체크 예외 'catch' or 'throw' (0) | 2022.10.01 |
댓글 영역