Java
자바의 다양한 기능들 4. reduce()
코딩펭귄
2024. 1. 9. 10:41
연산 수행에 대한 구현을 하는 reduce() 연산!
- 정의된 연산이 아닌 프로그래머가 직접 구현한 연산을 적용
- reduce()의 두번째 파라미터로(람다식으로) 구현할수있다(방법1) -> 만약 이 내용이 너무 많다면, BinaryOperator를 구현하고, Binary Operator를 구현한 클래스를 넣어주면 됨(아래 예시 중 방법2)
T reduce(T identify, BinaryOperator<T> accumulator)
- 최종 연산으로 스트림의 요소를 소모하며 연산을 수행
- 배열의 모든 요소의 합(sum을 쓸 수도 있지만,)을 구하는 reduce() 연산 구현 예
Arrays.stream(arr).reduce(0, (a,b)->a+b));
// reduce()에 들어가는 값 : 초기 - initial값, 2개의 매개변수 전달
// -> 자료를 다 소모할때까지 이루어져 합이 구해짐
- reduce() 메서드의 두 번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행 할 수 있음
- 람다식을 직접 구현하거나 람다식이 긴 경우 BinaryOperator를 구현한 클래스를 사용 함
예제) 문자열이 쭉 있을때, 문자열들중 가장 긴 문자열을 찾는것
방법1. 직접 reduce() 구현 & 람다식 이용해 s1, s2 비교하면서 계속 문자열들 비교
방법2. BinaryOperator을 구현한, CompareString 호출-> apply에 의해 String반환되고, String을 get 하는 방법
import java.util.Arrays;
import java.util.function.BinaryOperator;
//방법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;
}
}
// 방법1
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;}));
//방법2 호출방법
String str = Arrays.stream(greetings).reduce(new CompareString()).get(); //BinaryOperator를 구현한 클래스 이용
System.out.println(str); //안녕하세요~~~
}
}
* 한글 : 2byte, 영어 : 1byte이기 때문에 -> 안녕하세요~~~ 가 가장 긴 문자열로 출력됨