JAVA Programming

[76] 스트림 reduce 연산을 정의 (프로그래머가 직접 지정하는 연산 적용)

꾸준히개발하자 2020. 7. 21. 07:27

Reduce() 연산

정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용

최종 연산으로 스트림의 요소를 소모하며 연산 수행

배열의 모든 요소의 합을 구하는 reduce연산

기존의 연산이 아닌 내가 연산을 구현

Arrays.stream(arr).reduce(0,(a,b) -> a+b));

                                  0은 초기값 문자일시 “”

 

배열에서는  Arrays 로 스트림을 생성한다.  스트림에 배열 객체를 넣고 reduce() 메소드를 실행

처음값은 초기값을 넣고 그다음 매개변수 2개를 넣는다 연산을 정의한다. 

package stream;

import java.util.Arrays;

public class IntArrayTest {

	public static void main(String[] args) {
		
		int [] arr = {1,2,3,4,5};
		
		int[] arr2 = {6,7,8,9};
			
		System.out.println(Arrays.stream(arr).reduce(0, (a,b) -> a+b));// 전체를 다 더하게 됨 sum이랑똑같이 나오는데 직접 연산정의
		
		
		
		
	}
}

 

배열의 요소에서 가장 긴 문자를 추출하기 

스트림에 람다식을 사용할수있다. ( 조건식이 있을경우 ) 

바이트 단위이니까  getBytes().length 로 뽑는다. 

만약 이것이 너무 길다고 생각하면 

package stream;

import java.util.Arrays;

public class ReduceTest {
	public static void main(String[] args) {
		
		
		String[] greetings = {"안녕하세요","hello","Good"}; 
		
		// 가장 긴애를 반환해주는 
		
		System.out.println(Arrays.stream(greetings).reduce("",(s1,s2)->
		{ // 조건문이 들어가니 중괄호 , getBytes 는 한글은 2바이트씩이니까
			if(s1.getBytes().length >= s2.getBytes().length) 
				// s1과 s2를 비교를해서 길이가 더 긴애를 반환을 해준다. 
				return s1;
			else 
				return s2;
		}));
	}
}

 

 

직접  클래스를 만들어서  BinaryOperator<String> 을 상속받아서 

apply메소드에  구현하는 방법이있다.

 

main 메소드에서

배열을 만들고   Arrays.Stream(arr).reduce(new 클래스명()).get  // get은 얻어오다 라는 뜻 

 

package stream;

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


// 직접 구현하는 방법
class CompareString implements BinaryOperator<String>{

	@Override
	public String apply(String s1, String s2) {
		if(s1.getBytes().length >= s2.getBytes().length)
			return s1;
		else
			return s2;
	}
}
public class ReduceTest2 {
	public static void main(String[] args) {
		String[] arr = {"안녕하세요","Hello","NiceMeetoyou"};
		
		System.out.println(Arrays.stream(arr).reduce("",(a,b)->
		{
			if(a.getBytes().length >= b.getBytes().length)
				return a;
			else
				return b;
		}));
			
		// 결과를 get으로 받고 reduce에 위에 구현한 클래스를 넣는다. 
		System.out.println(Arrays.stream(arr).reduce(new CompareString()).get());
	}
}