개발/JAVA
[JAVA 8] Stream을 활용하여 합계를 구하는 여러가지 방법
상용최
2020. 8. 21. 09:07
반응형
예제에 사용할 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() 메소드를 사용할 수 있다.
개인적으로는 제일 가독성이 좋은것 같다.
반응형