1. 소개

이 빠른 사용방법(예제)에서는 Stream API 를 사용하여 정수의 합을 계산하는  다양한 방법을 조사 합니다 .

단순화를 위해 예제에서는 정수를 사용합니다. 그러나 long과 double에도 동일한 방법을 적용할 수 있습니다.

2. Stream.reduce() 사용

Stream.reduce() 는 스트림의 요소를 축소 하는 터미널 작업입니다 .

스트림의 각 요소에 이항 연산자(누산기)를 적용합니다. 여기서 첫 번째 피연산자는 이전 애플리케이션의 반환 값이고 두 번째 피연산자는 현재 스트림 요소입니다.

reduce() 메서드 를 사용하는 첫 번째 메서드  에서 accumulator 함수는 두 개의 Integer 값을 더하고 Integer 값을 반환하는 람다 식입니다 .

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, (a, b) -> a + b);

같은 방식으로 이미 존재하는 Java 메소드 를 사용할 수 있습니다 .

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, Integer::sum);

또는 사용자 정의 방법을 정의하고 사용할 수 있습니다.

public class ArithmeticUtils {

    public static int add(int a, int b) {
        return a + b;
    }
}

그런 다음 이 함수를 reduce() 메서드에 매개변수로 전달할 수 있습니다.

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, ArithmeticUtils::add);

3. Stream.collect() 사용

정수 List의 합을 계산하는 두 번째 방법은 collect()  터미널 작업을 사용하는 것입니다.

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .collect(Collectors.summingInt(Integer::intValue));

마찬가지로 Collectors 클래스는 각각 long과 double의 합을 계산하는 summingLong()summingDouble() 메서드를 제공합니다.

4. IntStream.sum() 사용

Stream API는 스트림을 IntStream 객체 로 변환하는 mapToInt() 중간 작업을 제공 합니다 .

이 메서드는 변환을 수행하는 데 사용하는 매퍼를 매개변수로 사용하며 스트림 요소의 합계를 계산하기 위해 sum() 메서드를 호출할 수 있습니다.

사용 방법에 대한 간단한 예를 살펴보겠습니다.

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .mapToInt(Integer::intValue)
  .sum();

같은 방식으로 mapToLong()mapToDouble() 메서드를 사용하여 각각 long과 double의 합을 계산할 수 있습니다.

5. 과 함께 Stream#sum 사용하기

Map<Object, Integer> 데이터 구조 의 값 합계를 계산하려면 먼저 해당 Map 의 값에서 스트림을 만듭니다. 다음으로 이전에 사용한 방법 중 하나를 적용합니다.

예를 들어 IntStream.sum() 사용 :

Integer sum = map.values()
  .stream()
  .mapToInt(Integer::valueOf)
  .sum();

6. 객체와 함께 Stream#sum 사용하기

객체 List이 있고 이러한 객체 의 지정된 필드에 있는 모든 값의 합계 를 계산하려고 한다고 가정해 보겠습니다 .

예를 들어:

public class Item {

    private int id;
    private Integer price;

    public Item(int id, Integer price) {
        this.id = id;
        this.price = price;
    }

    // Standard getters and setters
}

다음으로 다음 List에 있는 모든 항목의 총 가격을 계산한다고 가정해 보겠습니다.

Item item1 = new Item(1, 10);
Item item2 = new Item(2, 15);
Item item3 = new Item(3, 25);
Item item4 = new Item(4, 40);
        
List<Item> items = Arrays.asList(item1, item2, item3, item4);

이 경우 이전 예제에 표시된 방법을 사용하여 합계를 계산하려면 map() 메서드  를 호출하여 스트림을 정수 스트림으로 변환해야 합니다 .

결과적으로  Stream.reduce(),  Stream.collect() 및  IntStream.sum() 을 사용하여 합계를 계산할 수 있습니다.

Integer sum = items.stream()
  .map(x -> x.getPrice())
  .reduce(0, ArithmeticUtils::add);
Integer sum = items.stream()
  .map(x -> x.getPrice())
  .reduce(0, Integer::sum);
Integer sum = items.stream()
  .map(item -> item.getPrice())
  .reduce(0, (a, b) -> a + b);
Integer sum = items.stream()
  .map(x -> x.getPrice())
  .collect(Collectors.summingInt(Integer::intValue));
items.stream()
  .mapToInt(x -> x.getPrice())
  .sum();

7. 문자열 과 함께 Stream#sum 사용하기

일부 정수를 포함 하는 String 객체 가 있다고 가정해 보겠습니다 .

이 정수의 합을 계산하려면 먼저 해당 문자열배열 로 변환 해야 합니다. 다음 으로 정수가 아닌 요소를 걸러내고 마지막으로 해당 배열 의 나머지 요소를 숫자로 변환해야 합니다.

이 모든 단계를 실제로 살펴보겠습니다.

String string = "Item1 10 Item2 25 Item3 30 Item4 45";

Integer sum = Arrays.stream(string.split(" "))
    .filter((s) -> s.matches("\\d+"))
    .mapToInt(Integer::valueOf)
    .sum();

8. 결론

이 기사에서는 Stream API를 사용하여 정수 List의 합을 계산하는 방법에 대한 몇 가지 방법을 논의했습니다. 우리는 또한 이러한 방법을 사용하여 객체 List의 주어진 필드 값의 합계, Map 값의 합계 및 지정된 String 객체 내의 숫자를 계산했습니다 .

항상 그렇듯이 전체 코드는 GitHub 에서 사용할 수 있습니다 .

Generic footer banner