Programming

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

procodes 2020. 3. 5. 08:02
반응형

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();

정수 목록을 선언했습니다.

ArrayList<Integer> numberList = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));

아래의 다른 방법을 사용해보십시오.

사용 mapToInt

int sum = numberList.stream().mapToInt(Integer::intValue).sum();

사용 summarizingInt

int sum = numberList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getSum();

사용 reduce

int sum = numberList.stream().reduce(Integer::sum).get().intValue();

class Pojo{
    int num;

    public Pojo(int num) {
        super();
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

List<Pojo> list = new ArrayList<Pojo>();
            list.add(new Pojo(1));
            list.add(new Pojo(5));
            list.add(new Pojo(3));
            list.add(new Pojo(4));
            list.add(new Pojo(5));

            int totalSum = list.stream().mapToInt(pojo -> pojo.getNum()).sum();
            System.out.println(totalSum);

대부분의 측면이 다룹니다. 그러나 Integer, Long과는 별도로 다른 데이터 유형의 집계를 찾아야 할 수도 있습니다 (특별한 스트림 지원이 이미 존재 함). 예를 들어 BigInteger를 사용한 stram과 같은 유형의 경우 다음과 같이 reduce 작업을 사용할 수 있습니다

list.stream (). reduce ((bigInteger1, bigInteger2)-> bigInteger1.add (bigInteger2))

참고 URL : https://stackoverflow.com/questions/30125296/how-to-sum-a-list-of-integers-with-java-streams

반응형