新しいJava 8ストリーム機能を発見しました。Pythonから来て、2つの配列を「1行のpythonic」のように乗算する、合計のような配列の操作を実行するためのきちんとした方法があるかどうか疑問に思いました。
ありがとう
新しいJava 8ストリーム機能を発見しました。Pythonから来て、2つの配列を「1行のpythonic」のように乗算する、合計のような配列の操作を実行するためのきちんとした方法があるかどうか疑問に思いました。
ありがとう
回答:
java.util.Arrays
配列をJava 8ストリームに変換して、合計などに使用できる新しいメソッドが追加されました。
int sum = Arrays.stream(myIntArray)
.sum();
ストリーム操作と同時に値とインデックスを同時に取得する方法を考えることができないため、2つの配列を乗算するのは少し難しいです。これは、おそらく配列のインデックスを介してストリーミングする必要があることを意味します。
//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]);
編集
コメント者@Holgermap
は、次のforEach
ようにする代わりにメソッドを使用できると指摘しています。
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToInt
ボクシングを避けるために使用したいと思うかもしれませんが。
以下を使用して配列をストリームに変換できますArrays.stream()
。
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
ストリームを取得したら、ドキュメントで説明されているメソッドなどを使用できますsum()
。次のことができますmap
かfilter
ラムダ関数と関連するストリームメソッドを呼び出すことにより、Pythonで好き:
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();
Arrays.stream(arr)はStreamではなくLongStream(またはIntStream、...)を作成するため、マップ関数を使用してタイプを変更できないことに注意してください。これが、.mapToLong、mapToObject、...関数が提供される理由です。
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();