JAVA/Java 8

Java8 스트림(stream) 연산

위들 wedul 2018. 5. 31. 07:37
반응형

리덕션 연산
Stream reduce 메소드는 2개의 인자를 받아 인자와 같은 값을 리턴하는 (T,T) -> T 메소드이다.
 
 번째 인자는 누적되는 값이 되고, str2 foreach처럼 순서대로 요소가 들어오는 방식이다.



public static void main(String args[]) { List<String> list = Arrays.asList(new String[] {"a", "b", "c"}); Stream<String> stream = list.stream(); Optional<String> opt = stream.reduce((str1, str2) -> str1 + str2); opt.ifPresent(System.out::println); } =>> 리턴 값 "abc"



 다른 형태의 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


728x90
반응형
1 2 3 4 5 6 7 8 9 10 ··· 13