티스토리 뷰

목차

1. 리덕션

2. 병렬 스트림

 

 

 

 

1. 리덕션

스트림을 통해 들어가는 처음 두 개의 데이터에 대한 연산 결과와 다음 데이터를 연산하는 방식으로 최종 한 개의 결과값을 만들어내는 데이터 축소 연산.

T reduce(T identity, BinaryOperator<T> accumulator);
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
// T apply(T t1, T t2)
}
List<String> ls = Arrays.asList("Box", "Simple", "Complex", "Robot");

BinaryOperator<String> lc = 
    (s1, s2) -> { 
       if(s1.length() > s2.length())
           return s1;
       else 
           return s2;                   
    };

String str = ls.stream()
              .reduce("", lc);

System.out.println(str); // Complex

두 개의 String 형 인자를 받아 문자열의 길이가 긴 데이터를 리턴하는 BinaryOperator 를 만들어

reduce() 메소드의 두 번째 인자로 전달한다.

reduce() 연산의 결과 값으로 문자열의 길이가 가장 긴 Complex 가 반환된다.

 

reduce() 메소드의 첫 번째 인자 T identity

identity 로 전달되는 값은 reduce()의 첫번째 연산에 사용된다.

위의 코드에서 reduce("1234567", lc) 와 같이 인자를 전달하면 스트림을 통해 전달되는 값은

"1234567", "Box", "Simple", "Complex", "Robot" 이고 연산의 최종 결과 값으로 문자열의 길이가 가장 긴 "1234567" 가 반환된다.

 

Optional<T> reduce(BinaryOperator<T> accumulator);

identity 없이 BinaryOperator만 전달받아 reduce() 연산을 할 수도 있다.

positives.stream().reduce(Positive::add).get().getNumber();
public Positive add(Positive positive) {
    return new Positive(this.number + positive.number);
}

 

 

2. 병렬 스트림

병렬 처리: 한 개의 작업을 여러개의 core 가 진행하도록 한다.

규모가 큰 작업에는 유용하지만 단순한 작업을 병렬 처리하면 작업을 여러개로 나누고 합치는 작업이 오히려 더 많은 시간을 소요할 수 있다.

 

parallelStream() 메소드를 사용해서 간단하게 병렬 처리 연산 작업을 할 수 있다.

List<String> ls = Arrays.asList("Box", "Simple", "Complex", "Robot");

BinaryOperator<String> lc = 
    (s1, s2) -> { 
       if(s1.length() > s2.length())
           return s1;
       else 
           return s2;                   
    };

String str = ls.parallelStream()
              .reduce("", lc);

System.out.println(str);

 

일반 스트림의 parallel() 메소드를 호출해서 일반 스트림을 병렬 스트림으로 변경할 수도 있다.

String str = ss.parallel()
              .reduce("", lc);

 

 

 

 

출처

https://cafe.naver.com/cstudyjava 윤성우의 열혈 java

728x90