리덕션 연산
Stream의 reduce 메소드는 2개의 인자를 받아 인자와 같은 값을 리턴하는 (T,T) -> T 메소드이다.
첫 번째 인자는 누적되는 값이 되고, str2는 foreach처럼 순서대로 요소가 들어오는 방식이다.
또 다른 형태의 reduce 메소드
위에서 소개한 reduce 메소드 형태와 다르게 이번에 소개할 Reduce메소드는 3개의 인자를 받는다.
이 메소드는 반환 받으려는 타입과 연산하려는 타입이 다를 경우에 사용한다.
이 reduce의 형식은 reduce(U, 함수1, 함수2) 유형이고, C
리턴 타입은 첫 번째 인자인 U의 타입을 리턴한다.
첫 번째 인자는 시작 값으로 사용된다.
두 번째 인자인 함수 1은 (U, T) -> U 형식이다. 인자 2개를 받아 첫 번째 인자의 타입으로 리턴한다.
세 번째 인자인 함수2는 함수 1의 연산 결과들을 모아 연산한다. 타입은 (U, U) -> U이다.
예를 들어서,
WedulObject이라는 객체의 나이를 모두 더해서 값을 출력하고 싶을 때 사용한다.
1 2 3 4 | List<WedulObject> objects = Arrays.asList(new WedulObject("kim", 1, "dev"), new WedulObject("jun", 2, "insa"), new WedulObject("jung", 3, "kakao")); int ageSum = objects.stream().reduce(0, (result, object) -> result + object.getAge(), (result, age) -> result + age); System.out.println(ageSum); | cs |
두 번째 인자에서는 첫 번째 인자인 시작값과 입력된 person의 age값을 더한다.
0 + 10 + 11 + 12
세 번째 인자에서는 두 번째 인자에서 나온 결과를 모두 더한다.
10 + 11 + 12 = 33
※여기서 시작값을 1로 바꾸면 결과는 34, 2로 바꾸면 35로 출력된다.
이러한 방식을 사용하는 이유는
입력된 person의 age값을 두 번째 인자에서 병렬로 계산하고, 세 번째 인자에서 병렬로 처리한 결과들을 모두 통합해서 반환하고자 하는 타입으로 반환하고자 할 때
사용된다.
만약 단순하게 입력된 여러 person의 age값을 뽑아 병렬로 덧셈처리한 결과를 반환하고 싶을 경우에는 다음과 같이 처리하는게 더욱 효과적이다.
1 2 3 4 5 6 7 | public static void main(String args[]) { List<WedulObject> objects = Arrays.asList(new WedulObject("kim", 1, "dev"), new WedulObject("jun", 2, "insa"), new WedulObject("jung", 3, "kakao")); int ageSum = objects.stream().filter(x -> x.getAge() > 2).mapToInt(WedulObject::getAge).sum(); System.out.println(ageSum); } | cs |
'JAVA > Java 8' 카테고리의 다른 글
자바 8에서 java.util.function 패키지에 추가된 기본 함수형 인터페이스 정리 (0) | 2018.05.31 |
---|---|
Java8 스트림을 이용한 데이터 추출 (0) | 2018.05.31 |
Java8 스트림(Stream) API (0) | 2018.05.31 |
Java8 인터페이스의 정적 메소드 (0) | 2018.05.30 |
Java8 인터페이스 default Method (디폴트 메소드) (0) | 2018.05.30 |