reduce() 연산
: 정의된 연산이 아닌 프로그래머가 직접 구현한 연산을 적용
최종 연산으로 스트림의 요소를 소모하여 연산을 수행
T reduce( T identify, BinaryOperator<T> accumulator)
- identify는 기본값
- BinaryOperator 라는 인터페이스를 구현한 부분(람다식으로 대체 가능)
ex) 배열의 모든 요소의 합을 구하는 reduce() 연산 구현
Arrays.stream(arr).reduce(0,(a,b)->a+b));
초기 0 값 : sum을 위한 값
a,b의 매개변수 값
자료를 소모할 때까지 두개의 요소를 더해라~
reduce() 메소드의 두번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행할 수 있음
결론 : 람다식을 직접 구현하거나 람다식이 긴 경우 BinaryOperator를 구현한 클래스를 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
class CompareString implements BinaryOperator<String>{
// BinaryOperator를 구현하여 배열에 여러 문자열이 있을 때 길이가 가장 긴 문자열 찾기
// 반드시 apply() 메소드를 구현하여야함
// 두개의 인자를 받아서 처리
@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", "반갑습니다^^"};
// 1. reduce 연산
System.out.println(Arrays.stream(greetings).reduce("", (s1, s2)->
{if (s1.getBytes().length >= s2.getBytes().length)
return s1;
else return s2;}));
// 2. BinaryOperator 구
String str = Arrays.stream(greetings).reduce(new CompareString()).get(); //BinaryOperator를 구현한 클래스 이용
System.out.println(str);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class TravelCustomerTest {
public static void main(String args[]) {
TravelCustomer lee = new TravelCustomer("lee",20,1000);
TravelCustomer park = new TravelCustomer("park",31,200);
TravelCustomer kim = new TravelCustomer("kim",24,500);
List<TravelCustomer> customList = new ArrayList<TravelCustomer>();
customList.add(lee);
customList.add(park);
customList.add(kim);
System.out.println("고객 명단 출력");
// TravelCustomer 에서 toString() 호출
// forEach() 최종연산
customList.stream().forEach(s->System.out.println(s));
// 일므만 출력하기 위한 중간에 map()를 통해 get
// map() 중간연산
customList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
// mapToInt를 통해 가격의 값을 가져와 sum()를 사용하여 최종 합계 연산
System.out.println(customList.stream().mapToInt(c->c.getPrice()).sum());
// 20세 이상의 고객의 이름을 정렬하여 출력
// 연산의 c 변수는 각각 연산마다 중복되도 상관없음
customList.stream().filter(c->c.getAge()>=20).map(c->c.getName()).sorted().forEach(s->System.out.println(s));
}
}
|
cs |
'OOP > Java' 카테고리의 다른 글
사용자 정의 예외 클래스 (0) | 2022.05.18 |
---|---|
예외처리 (Exception)는 왜 하는가? (0) | 2022.05.11 |
스트림(Stream) (0) | 2022.05.09 |
람다식 구현 방식 (0) | 2022.05.09 |
람다식(Lamda expression) (0) | 2022.05.02 |