반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- RestTemplate
- Spring Boot
- vaultTemplate
- java
- AOP
- AOP 매개변수
- Stream
- AOP target
- 개방/폐쇄 원칙
- ClientHttpRequestInterceptor
- findFirst
- JsonType
- LogInterceptor
- restTemple
- AOP this
- JsonStringType
- AccessLevel
- 포맷터
- Thread Safety
- Save Action
- auto configuration
- Starter
- findAny
- gradle
- ResponseBodyAdvice
- jpa
- 쓰레드 안전
- @AutoConfiguration
- spring
- fotmatter
Archives
- Today
- Total
맨땅에 헤딩하는 개바른자
[Java] Stream > reduce 본문
반응형
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
참조
반응형
'JAVA > Stream' 카테고리의 다른 글
[Java] Stream > findAny, findFirst (0) | 2023.07.04 |
---|---|
[Java] Stream > toMap (0) | 2023.06.20 |
[Java] Stream > foreach (0) | 2023.06.20 |
[Java] Stream > distinct (0) | 2023.06.08 |
[Java] Stream > flatMap (0) | 2023.06.08 |