컴퓨터공학 💻 도서관📚

Part2. 6-6 연산 수행에 대한 구현을 할 수 있는 reduce()연산 (Stream의 메서드) 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 6-6 연산 수행에 대한 구현을 할 수 있는 reduce()연산 (Stream의 메서드)

들판속초록풀 2025. 7. 29. 23:33

reduce() 는 Stream의 메서드이고  최종연산이다.

 

 

스트림에 대해서 하고 싶은 특정 연산을 직접 정의할 수 있는 연산을 알아보자

reduce() 연산

  • 정의된 연산이 아닌 프로그래머가 직접 구현한 연산을 적용
T reduce(T identify, BinaryOperator<T> accumulator)
// 배열의 모든 요소의 합을 구하는 reduce() 연산 구현 예

Arrays.stream(arr).reduce(0, (a,b)->a+b));  // 람다식을 넣은 경우 : add 함수 구현
  • 1번째 매개변수는 기본값
    2번째는 BinaryOperator 라는 인터페이스를 구현한 부분인데 이 부분은 람다식을 직접 쓸 수도 있고
    여기에 쓸 람다식이 좀 길때는 BinaryOperator를 implement한 클래스를 넣어도 된다.
  • reduce() 메서드의 두 번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행 할 수 있음
  • 2번째 연산이 자료를 다 소진할 때까지 반복된다 (a, b 값이 재귀함수처럼 계속 전달되면서 연산이 된다)
  • 최종 연산으로 스트림의 요소를 소모하며 연산을 수행
 

BinaryOperator를 구현하여 배열에 여러 문자열이 있을 때 길이가 가장 긴 문자열 찾기 예

// BinaryOperator는 인터페이스여서 꼭 구현해야하는 메서드가 있다. 그것이 apply 메서드이다.
// apply 메서드는 내부적으로 순차적으로 호출이 된 2개의 인자를 받는다

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 ReduceTest {

	public static void main(String[] args) {

		String[] greetings = {"안녕하세요~~~", "hello", "Good morning", "반갑습니다^^"};
		
		System.out.println(Arrays.stream(greetings).reduce("", (s1, s2)-> 
		                          {if (s1.getBytes().length >= s2.getBytes().length)   // 람다식 
				                                  return s1;
		                          else return s2;})); 
		                                                                               // 클래스 
		String str = Arrays.stream(greetings).reduce(new CompareString()).get(); //BinaryOperator를 구현한 클래스 이용
		System.out.println(str);                                      // get 메서드로 결과값 출력
		                          
	}
}
Comments