JAVA/Stream
[Java] Stream > reduce
앵낄낄
2023. 6. 20. 20:19
반응형
git
https://github.com/ymwoo88/stream/tree/feature/reduce-%EC%98%88%EC%A0%9C
설명
Stream.reduce(accumulator) 함수는 Stream의 요소들을 하나의 데이터로 만드는 작업을 수행합니다.
예를 들어, Stream에서 1부터 10까지 숫자가 전달될 때, 이 값을 모두 합하여 55의 결과가 리턴되도록 만들 수 있습니다. 여기서 연산을 수행하는 부분은 accumulator 함수이며, 직접 구현해서 인자로 전달해야 합니다.
reduce
제공된 ID 값과 연관 누적 함수를 사용하여 이 스트림의 요소에 대한 축소를 수행하고 축소된 값을 반환합니다. 이는 다음과 같습니다.
T 결과 = 동일성; for (T 요소 : 이 스트림) result = accumulator.apply(result, element) return result;
그러나 순차적으로 실행하도록 제한되지는 않습니다.
ID 값은 누산기 함수의 ID여야 합니다. 이는 모든 t에 대해 accumulator.apply(identity, t)가 t와 같음을 의미합니다. 누산기 함수는 결합 함수여야 합니다.
이것은 터미널 작업입니다.
매개변수:
identity – 누산 함수의 식별 값 accumulator – 두 값을 결합하기 위한 연관, 비간섭, 상태 비저장 함수
보고:
감소의 결과
API 참고:
합계, 최소값, 최대값, 평균 및 문자열 연결은 모두 축소의 특수한 경우입니다. 일련의 숫자를 합산하면 다음과 같이 표현할 수 있습니다.
정수 합 = integers.reduce(0, (a, b) -> a+b);
또는:
정수 sum = integers.reduce(0, Integer::sum);
이것은 단순히 루프에서 누계를 변경하는 것과 비교하여 집계를 수행하는 더 우회적인 방법으로 보일 수 있지만 감소 작업은 추가 동기화가 필요하지 않고 데이터 경합의 위험을 크게 줄이면서 보다 우아하게 병렬화됩니다.
T reduce(T identity, BinaryOperator<T> accumulator);
예제
- 샘플 데이터
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
- 예졔1) 초기값이 없는 경우
@Test
@DisplayName("초기값이 없는 경우")
void case1() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.stream()
.reduce((x, y) -> x + y) // stream의 데이터를 모두 더해서 반환
.get();
log.info("전체 합 : {}", sum);
int min = numbers.stream()
.reduce((x, y) -> x < y ? x : y) // stream의 데이터 중 가장 작은 데이터 반환 -> min과 동일
.get();
log.info("최소 값 뽑기 : {}", min);
}
20:16:07.242 [Test worker] INFO com.ymwoo.stream.reduce.StreamReduceTest -- 전체 합 : 55
20:16:07.246 [Test worker] INFO com.ymwoo.stream.reduce.StreamReduceTest -- 최소 값 뽑기 : 1
- 예졔2) 초기값이 존재하는 경우
@Test
@DisplayName("초기값이 존재하는 경우")
void case2() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 초기 값이 존재하는 경우 .get()이 생량된다 이미 반환 될 초기 값이 존재하기 때문이다.
int sum = numbers.stream()
.reduce(10, (x, y) -> x + y); // stream의 데이터를 모두 더해서 반환
log.info("전체 합 : {}", sum);
int min = numbers.stream()
.reduce(10, (x, y) -> x < y ? x : y); // stream의 데이터 중 가장 작은 데이터 반환 -> min과 동일
log.info("최소 값 뽑기 : {}", min);
}
20:16:58.576 [Test worker] INFO com.ymwoo.stream.reduce.StreamReduceTest -- 전체 합 : 65
20:16:58.580 [Test worker] INFO com.ymwoo.stream.reduce.StreamReduceTest -- 최소 값 뽑기 : 1
참조
반응형