반응형
예제에 사용할 Class는 2가지가 있다.
Dish Class 와 main Class
Dish.class
package streamexam;
public class Dish {
private String name;
private int calories;
public Dish(String name, int calories) {
this.name = name;
this.calories = calories;
}
public String getName() {
return name;
}
public int getCalories() {
return calories;
}
}
main.class
import streamexam.Dish;
import java.util.ArrayList;
import java.util.List;
import static java.util.stream.Collectors.reducing;
public class main {
public static void main(String[] args) {
Dish dish0 = new Dish("pasta",300);
Dish dish1 = new Dish("tomato", 100);
Dish dish2 = new Dish("coffee", 700);
Dish dish3 = new Dish("pizza", 1000);
Dish dish4 = new Dish("pork",1200);
List<Dish> menu = new ArrayList<>();
menu.add(dish0);
menu.add(dish1);
menu.add(dish2);
menu.add(dish3);
menu.add(dish4);
Integer sum = menu.stream()
.collect(reducing(0, Dish::getCalories, (i, j) -> i + j));
Integer integerSum = menu.stream()
.collect(reducing(0, Dish::getCalories, Integer::sum));
Integer optionalSum = menu.stream()
.map(Dish::getCalories)
.collect(reducing(Integer::sum))
.get();
int sum1 = menu.stream()
.mapToInt(Dish::getCalories)
.sum();
System.out.println(sum1);
}
}
방법 1. reducing 을 이용한 방법이다. reducing은 Function<T,T,T> 이다.
즉 입력값과 return 값의 타입이 동일해야한다.
reducing(초기값, 더할값, 초기값 + 더할값) 이라고 생각하면 간단하다.
하지만 가독성이 그리 좋다고 말할 순 없을것 같다.
방법 2. 마찬가지로 reducing을 이용했다. 달라진점은 더하는 부분을 메소드 참조로 바꿧다.
방법 1과 동일하지만 가독성이 좋아졌다.
특별히 읽지않아도 아 Calories를 더하는 기능을 하겠구나라고 유추 할 수 있다.
방법 3. 마찬가지로 reducing을 이용하였지만 reducing을 하기전에 Calories만 추출했다.
결과로 Optional이 떨어지지만 결과값에 Optional.empty 는 오지않으므로 안심하고 get을 사용할 수 있다.
방법 4. mapToInt를 활용한 방법이다. mapToInt를 사용한다면 sum() 메소드를 사용할 수 있다.
개인적으로는 제일 가독성이 좋은것 같다.
반응형
'개발 > JAVA' 카테고리의 다른 글
[JAVA] 함수의 결과를 성공과 실패만 판단하면 될때 반환값으로 어떤값이 좋을까? (2) | 2020.09.15 |
---|---|
[JAVA] Stream을 이용하여 Map 안에 있는 값 간편하게 출력하기 (0) | 2020.08.23 |
[enum] enum의 활용방법 (0) | 2020.07.11 |
[effective java 3/E] 제네릭 <로 타입은 사용하지 말라> (0) | 2020.07.11 |
[effective java 3/E] 추상 클래스보다는 인터페이스를 우선하라. (0) | 2020.07.08 |
댓글