Java 8 스트림 및 어레이 작업


197

방금 새로운 Java 8 스트림 기능을 발견했습니다. 파이썬에서 왔을 때, 합산과 같은 배열에서 연산을 수행하는 깔끔한 방법이 있는지 궁금해했습니다. 두 배열을 "한 줄 피 토닉"방식으로 곱한 것입니까?

감사

답변:


294

java.util.Arrays배열을 Java 8 스트림으로 변환하여 합산 등에 사용할 수 있는 새로운 메소드가 추가되었습니다 .

int sum =  Arrays.stream(myIntArray)
                 .sum();

Stream 연산과 동시에 값과 인덱스를 얻는 방법을 생각할 수 없으므로 두 배열을 곱하면 조금 더 어려워집니다. 이것은 아마도 배열의 인덱스를 통해 스트리밍해야 함을 의미합니다.

//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...

int[] result = new int[a.length];

IntStream.range(0, a.length)
         .forEach(i -> result[i] = a[i] * b[i]);

편집하다

Commenter @Holgermap 는 다음 forEach과 같이 대신 메소드를 사용할 수 있다고 지적 합니다.

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();

13
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();
Holger 2016 년

2
@Holger 그렇습니다. mapToInt복싱을 피하기 위해 사용하고 싶을 수도 있습니다 .
dkatzel 2016 년

마지막으로 결과를 위해 스토리지를 사전 할당해야하는 zip 시뮬레이션에 해당합니다. Streams 라이브러리에 zip이없는 이유가 궁금합니다.
Reb. Cabin

이 SO 답변 에 따르면 zip은 Java 8의 이전 베타 버전에 있었고 꺼내 었습니다. 운 좋게도 포스터에는 소스가 있으며 그 답이 있습니다. 코드를 여러 번 사용했으며 잘 작동하는 것 같습니다.
sparc_spread 17:29에

@dkatzel — 이미 IntStream이므로 "map"은 IntUnaryOperator를 사용하므로 권투가 필요하지 않습니다.
M. Justin

58

다음을 사용하여 배열을 스트림으로 변환 할 수 있습니다 Arrays.stream().

int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);

당신이 당신의 스트림을 가지고하면, 당신은에 설명 된 방법 중 하나를 사용할 수있는 문서 와 같은, sum()또는 무엇이든을. Lambda 함수를 사용하여 관련 스트림 메서드를 호출하여 Python에서 map또는 filter좋아할 수 있습니다 .

Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);

스트림 수정이 끝나면 toArray()다른 곳에서 사용하기 위해 스트림으로 다시 변환하여 호출 합니다.

int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();

9

많은 수를 처리해야하는 경우주의하십시오.

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0

위의 합계는 아닙니다 2 * Integer.MIN_VALUE. 이 경우이 작업을 수행해야합니다.

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.