본문 바로가기
Java/Java

[Java] 리덕션(Reduction)과 병렬 스트림(Parallel Streams)

by 기록하는_사람 2022. 10. 21.

리덕션(Reduction)

📌 리덕션(Reduction)

: 데이터를 축소하는 연산.

리덕션(Reduction) 연산 진행 방식

 

💡  BinaryOperator<T>의 추상 메소드 : T apply(T t1, T t2)

T reduce(T identity, BinaryOperator<T> accumulator)

 

📌 stream이 빈 경우, reduce 메소드의 첫 번째  인자 반환. 

 

📌 stream이  비어 있지 않은 경우, reduce 메소드의 첫 번째 인자를 스트림의 첫 번째 데이터로 간주함. 

 

📄 StreamReduceTest.java

package reduction;

import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;

public class StreamReduceTest {

	public static void main(String[] args) {
		List<String> li = Arrays.asList("apple", "banana", "blueberry", "pear", "watermelon");
		
		BinaryOperator<String> lc = (s1, s2) -> {  // 문자열 길이 비교. 
			if(s1.length() > s2.length()) {
				return s1;
			}
			else {
				return s2;
			}
		};
		
		String s = li.stream()
		             .reduce("", lc);
		System.out.println(s);  // watermelon
	}

}

 

병렬 스트림(Parallel Streams)

📌 병렬 스트림(Parallel Streams)

: 하나의 작업을 둘 이상의  작업으로 나눠 동시에  진행하는 것.

병렬 스트림(Parallel Stream) 연산 진행 방식

 

📄 StreamParallelTest.java

package reduction;

import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;

public class StreamParallelTest {

	public static void main(String[] args) {
		List<String> li = Arrays.asList("apple", "banana", "blueberry", "pear", "watermelon");
		
		BinaryOperator<String> lc = (s1, s2) -> {  // 문자열 길이 비교. 
			if(s1.length() > s2.length()) {
				return s1;
			}
			else {
				return s2;
			}
		};
		
		String s = li.parallelStream()  // 병렬 스트림.
		             .reduce("", lc);
		System.out.println(s);  // watermelon
	}

}

 

📌 이미 생성된 스트림을 병렬 스트림으로  변경 가능.

DoubleStream parallel()
IntStream parallel()
LongStream parallel()

 

📄 ToParallelStreamTest.java

package stream2;

import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;

public class ToParallelStreamTest {

	public static void main(String[] args) {
		List<String> li = Arrays.asList("apple", "banana", "blueberry", "pear", "watermelon");
		Stream<String> ss = li.stream();  // 스트림 생성.
		
		BinaryOperator<String> lc = (s1, s2) -> {  // 문자열 길이 비교. 
			if(s1.length() > s2.length()) {
				return s1;
			}
			else {
				return s2;
			}
		};
		
		String s = ss.parallel()  // 병렬 스트림으로 변경.
				     .reduce("", lc);
		System.out.println(s);  // watermelon
	}

}

댓글