[java] Java 8 스트림 및 어레이 작업

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

감사



답변

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


답변

다음을 사용하여 배열을 스트림으로 변환 할 수 있습니다 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();


답변

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

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


답변

Arrays.stream (arr)은 Stream 대신 LongStream (또는 IntStream, …)을 생성하므로지도 함수를 사용하여 유형을 수정할 수 없습니다. .mapToLong, mapToObject, … 함수가 제공되는 이유입니다.

배열에서 스트리밍 할 때 왜 i-map-integers-to-strings를 살펴보십시오.


답변