방금 새로운 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, … 함수가 제공되는 이유입니다.