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 에서 사용할 수 있습니다 .