Java 스트림으로 숫자 합산

1. 소개

이 빠른 자습서에서는 Stream API를 사용하여 정수 합계를 계산하는 다양한 방법을 보여줍니다 .

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

2. Stream.reduce () 사용

Stream.reduce ()stream의 요소에 대해 감소 수행 하는 터미널 작업입니다 .

이항 연산자 (누산기)를 스트림의 각 요소에 적용합니다. 첫 번째 피연산자는 이전 응용 프로그램의 반환 값이고 두 번째 피연산자는 현재 스트림 요소입니다.

사용하는 첫 번째 방법으로 감소 () 메소드를 축적 기능은 두 개의 추가 람다 표현 하는 정수 값을 반환하고, 정수 값 :

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

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

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

3. Stream.collect () 사용

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

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

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

4. IntStream.sum () 사용

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

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

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

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

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

5. Map 과 함께 Stream # sum 사용

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

예를 들어 IntStream.sum () 을 사용 하면 다음과 같습니다.

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

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

객체 목록이 있고 이러한 객체 의 주어진 필드대한 모든 값의 합계 를 계산한다고 가정 해 보겠습니다 .

예를 들면 :

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 } 

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

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 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 객체 가 있다고 가정 해 봅시다 .

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

이 모든 단계가 실제로 실행되는 것을 보겠습니다.

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를 사용하여 정수 목록의 합계를 계산하는 방법에 대한 몇 가지 방법을 살펴 보았습니다. 또한 이러한 방법을 사용하여 객체 목록의 주어진 필드 값의 합계, 맵 값의 합계 및 주어진 String 객체 내의 숫자를 계산했습니다 .

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