본문 바로가기
개발/JAVA

[JAVA 8] Stream을 활용하여 합계를 구하는 여러가지 방법

by 상용최 2020. 8. 21.
반응형

예제에 사용할 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() 메소드를 사용할 수 있다.

개인적으로는 제일 가독성이 좋은것 같다.

 

 

반응형

댓글