[java] Java 스트림과 정수 목록을 합산하는 방법은 무엇입니까?

정수 목록을 합치고 싶습니다. 다음과 같이 작동하지만 구문이 옳지 않습니다. 코드를 최적화 할 수 있습니까?

Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();



답변

이것은 작동하지만, i -> i자동 언 박싱을 수행하고 있기 때문에 이상한 느낌이 든다. 다음 중 하나가 작동하고 원래 구문으로 컴파일러가 수행하는 작업을 더 잘 설명합니다.

integers.values().stream().mapToInt(i -> i.intValue()).sum();
integers.values().stream().mapToInt(Integer::intValue).sum();


답변

두 가지 옵션을 더 제안합니다.

integers.values().stream().mapToInt(Integer::intValue).sum();
integers.values().stream().collect(Collectors.summingInt(Integer::intValue));

두 번째는 Collectors.summingInt()콜렉터를 summingLong()사용하며 함께 사용할 콜렉터 도 있습니다 mapToLong.


세 번째 옵션 : Java 8 LongAdder에는 병렬 스트림 및 멀티 스레드 환경에서 요약 속도를 높이도록 설계된 매우 효과적인 누산기가 도입 되었습니다. 다음은 사용 예입니다.

LongAdder a = new LongAdder();
map.values().parallelStream().forEach(a::add);
sum = a.intValue();


답변

로부터 문서

축소 연산 축소 연산 (폴드라고도 함)은 일련의 입력 요소를 가져 와서 일련의 숫자 합 또는 최대 값을 찾거나 요소를 누적하는 등의 결합 연산을 반복적으로 적용하여 단일 요약 결과로 결합합니다. 목록. 스트림 클래스에는 sum (), max () 또는 count ()와 같은 여러 특수 축소 형식뿐만 아니라 reduce () 및 collect ()라는 여러 일반 축소 연산 형식이 있습니다.

물론 이러한 작업은 다음과 같이 간단한 순차 루프로 쉽게 구현할 수 있습니다.

int sum = 0;
for (int x : numbers) {
   sum += x;
}

그러나, 상기와 같은 변이 누적에 비해 감소 동작을 선호하는 데에는 충분한 이유가있다. 축소는 “보다 추상적”일뿐 아니라 개별 요소가 아닌 전체 스트림에서 작동하지만 요소를 처리하는 데 사용되는 함수가 연관되어있는 한 올바르게 구성된 축소 작업은 본질적으로 병렬화 가능합니다. 그리고 무국적자. 예를 들어, 합계를 찾고자하는 일련의 숫자가 주어지면 다음과 같이 쓸 수 있습니다.

int sum = numbers.stream().reduce(0, (x,y) -> x+y);

또는:

int sum = numbers.stream().reduce(0, Integer::sum);

이러한 축소 작업은 거의 수정없이 안전하게 병렬로 실행할 수 있습니다.

int sum = numbers.parallelStream().reduce(0, Integer::sum);

따라서지도의 경우 다음을 사용합니다.

integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y);

또는:

integers.values().stream().reduce(0, Integer::sum);


답변

감소 방법을 사용할 수 있습니다.

long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y);

또는

long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum);


답변

reduce()정수 목록을 합산하는 데 사용할 수 있습니다 .

int sum = integers.values().stream().reduce(0, Integer::sum);


답변

collect 메소드를 사용하여 정수 목록을 추가 할 수 있습니다.

List<Integer> list = Arrays.asList(2, 4, 5, 6);
int sum = list.stream().collect(Collectors.summingInt(Integer::intValue));


답변

이것은 inttype array ( longarray LongStream, doublearray DoubleStream등) 를 요약하는 가장 짧은 방법 입니다. 모든 원시 정수 또는 부동 소수점 유형이 Stream구현을 갖는 것은 아닙니다.

IntStream.of(integers).sum();