- Java Functional하게 사용하기 - 42022년 02월 17일 00시 13분 19초에 업로드 된 글입니다.작성자: jCurve728x90반응형
Stream의 종결 처리
중간처리를 통과한 Stream 데이터들을 종결 처리로 합을 구하거나 , 최대 최소 값을 구하건, 리스트로 다시 모으는 등의 종결 작업을 할 수 있는데 이번에는 Stream의 종결 처리에 대해 알아 보겠습니다.
우선 최대, 최소, 개수를 얻을 수 있는 종결 처리 메서드를 보면
이렇게 Comparator를 람다식으로 파라미터로 전달해 Optional 반환값을 받을 수 있습니다.
min 또한 마찬가지이고 count를 보자면
이런식으로 filter를 통과한 Stream 데이터들의 개수를 반환하는 것을 볼 수 있습니다.
다음은 allMatch, anyMatch를 보겠습니다.
allMatch는 Stream 안의 모든 데이터가 predicate을 만돈해야 true를 반환하고
anyMatch는 Stream 안의 데이터 중 하나라도 predicate을 만족하면 true를 반환하는 메서드이며
다음과 같이 사용합니다.
이번엔 findFirst, findAny를 보겠습니다.
이름에서 유추할 수 있듯
findFirst는 Stream 안의 첫 데이터를 반환하고 비어있으면 빈 Optional을 반환합니다.
findAny는 Stream안의 아무 데이터나 반환하는데 순서가 중요하지 않다 -> 따라서 Parallel Stream 사용할 때 최적화를 할 수 있음.
Reduce
주어진 함수를 반복 적용해서 Stream 안의 데이터를 하나의 값으로 합치는 메서드 입니다.
초기값이 있다면 적용해서 accumulator를 사용해 데이터를 처리한다.
위 그림처럼 사용할 수 있음.
이번엔 개인적으로 자주 사용하는 Collectors collect메서드를 봅시다.
collect는 collector를 사용해서 stream 안의 데이터를 합칠 때 사용된다.
이 collector는
- toList
- toSet
- mapping
- reducing
- toMap
- groupingBy
- partitioningBy
등이 있는데
toList, toSet, mapping, reducing은
이처럼 사용할 수 있다.
toMap, groupingBy, partitioningBy는
toMap
groupingBy
partitionBy
이런식을 사용할 수 있다.
평소에 많이들 사용하는 for문 for-each 문법도 stream forEach를 통해 각 데이터 처리 할 수 있다.
근데 iterable 인터페이스도 forEach가 있어서 Stream의 중간 처리가 필요 없으면 iterable collection(set, list 등)에서 바로 쓸 수 있다.
마지막으로 병렬 처리를 위한 parallel stream을 알아볼건데
이는 여러개의 스레드를 사용해서 stream의 처리를 병렬화하는 방식이고
중간 과정은 병렬 처리 되지만 순서가 있는 stream의 경우 종결 처리 후 결과물이 기존 순차 처리 결과와 일치하도록 조정이 된다. -> list로 collect하면 순서가 항상 올바르게 나옴
이제 장점은 간단하게 병렬 처리를 사용할 수 있고 병렬 처리라서 속도가 빨라질 수 있으나
항상 속도가 빨라지는 것은 아니고 deadlock 발생의 위험과 동시성 문제를 해결하기 위한 방식을 사용했을 때 성능 처하 등의 문제가 있다.
반응형'JAVA' 카테고리의 다른 글
BigDecimal 정리 (0) 2024.01.07 Java Functional하게 사용하기 - 5 (0) 2022.02.17 Java Functional하게 사용하기 - 3 (0) 2022.02.12 Java Functional하게 사용하기 - 2 (0) 2022.02.07 Java Functional하게 사용하기 - 1 (0) 2022.02.03 댓글