요소들의 합이나 최대, 최소 값으로 요약된 결과를 구하는데 사용됩니다.
요소를 누적하는 결합 연산을 반복하여 하나의 요약된 결과를 얻기 위해 사용됩니다.
개별적인 요소가 아닌 스트림으로 연산하여 적절히 구성된 reduction(축소) 연산은 병렬화가 가능합니다.
"Reduction parallellizes well because the implementation can operate on subsets of the data in parallel, and then combine the intermediate results to get the final correct answer."
private List<Student> students;
private List<Integer> list;
@Before
public void createObject() {
students = new ArrayList<>();
students.add(new Student("Aj", 20, "A"));
students.add(new Student("Ky", 25, "B"));
students.add(new Student("Pu", 24, "C"));
students.add(new Student("Ta", 30, "B"));
students.add(new Student("Sa", 40, "C"));
}
@Before
public void createInteger() {
list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
}
identity는 요약되는 값의 초기 값을 의미합니다.
요소의 값이 비어 있더라도 빈 Optional 객체를 반환하지 않고 초기 identity(default) 값을 반환됩니다.
@Before
public void createInteger(){
list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.add(40);
list.add(50);
}
@Test
public void reduceIdentity(){
int totalSum = list.stream()
.reduce(10000, (partialSum, num) -> partialSum + num);
System.out.println("totalSum is " + totalSum);
}
---출력결과---
totalSum is 100150
누적 함수를 사용하여 스트림의 요소들을 하나의 결과로 축소하여 반환합니다.
@Test
public void reduceAccumulator() {
Optional<Integer> totalAge = students.stream()
.map(p -> p.getAge())
.reduce((a, b) -> a + b);
if (totalAge.isPresent()) {
System.out.println("totalAge is " + totalAge);
}
}
---출력결과---
totalAge is Optional[139]
요소의 합을 구하는 경우 intStream으로 변환하여 사용할 수 있습니다.
@Test
public void sumIntStream() {
int totalAge = students.stream()
.mapToInt(p -> p.getAge())
.sum();
System.out.println("totalAge is " + totalAge);
}
---출력결과---
totalAge is 139
요소와 identity 값을 누적하여 결합 연산을 합니다.
병렬 스트림 사용은 하나의 스트림을 여러 서브 스트림으로 분할합니다.
분할되어진 서브 스트림들의 결과를 최종적으로 하나의 결과로 결합하여 반환합니다.
list 1 → reduce(...) → 10500 + 1 = 10501
list 2 → reduce(...) → 10500 + 2 = 10502
list 3 → reduce(...) → 10500 + 3 = 10503
...
@Test
public void reduceParallelStream(){
int totalSum = list.parallelStream()
.reduce(10500, (partialSum, num) -> partialSum + num);
System.out.println("totalSum is " + totalSum);
}
---출력결과---
totalSum is 52515
@Test
public void maxMin() {
Optional<Integer> max = list.stream()
.max(Comparator.naturalOrder());
System.out.println("max is " + max);
Optional<Integer> min = list.stream()
.min(Comparator.naturalOrder());
System.out.println("min is " + min);
}
---출력결과---
max is Optional[5]
min is Optional[1]
[Stream] collect method (0) | 2020.07.31 |
---|---|
[Stream] finding operation (0) | 2020.07.30 |
[Stream] Match method (0) | 2020.07.28 |
[Stream] slice method (0) | 2020.07.27 |
[Stream] Optional 클래스 (0) | 2020.07.23 |
댓글 영역