ストリームを含むJavaでshort []をList <Short>に変換する方法は?


8

私はこの質問から外挿できると考えましたが、できません

もちろんできます

short[] shortarray = {0,1,2};
List<Short> shortList = new ArrayList<Short>();
for (Short s : shortarray) {
    shortList.add(s);
}

しかし、私はストリームでそれを行う方法を考えています。

List<Short> shortList = Arrays.stream(shortarray).boxed()
                              .collect(Collectors.toList());

たとえば動作しませんが、収量 The method stream(T[]) in the type Arrays is not applicable for the arguments (short[])

回答:


9

何故なの

IntStream.range(0, shortarray.length)
         .mapToObj(s -> shortarray[s])
         .collect(Collectors.toList());

なぜそうmapToObjでないのmapToIntか(または単純なのmapか)?のIntStream代わりにを使用することは、Stream<Integer>プリミティブなintまたはshortを処理するほとんどすべての状況で推奨されます。
ポリノーム

mapToInt最後にList<Integer>、ではなくインスタンスを収集しますList<Short>
Sachith Dickwella

1
@Polygnome私はあなたがポイントを持っていると信じていますが、OPは要素をに集めているList<Short>ので、ボクシングは避けられません。
ernest_k

1
@Polygnomeは、「ほとんどすべての状況で」、ただしタスクがを生成する場合を除きますList<Short>。実生活でこのようなニーズに遭遇したことはありません…
ホルガー

1

なぜプリミティブなshort []では機能しないのかについて:

Streamタイプのshortはありません。ストリームは、プリミティブ以外のタイプ、またはIntStream、LongStream、DoubleStreamでのみ機能し ます。

これを機能させるには、shortを互換性のあるStreamのあるデータ型、たとえばShortに変換するか、IntStreamのintに変換する必要があります(ernest_kの回答を参照)。


はい、キャストできませんが、各エントリを変換できます。私はそれを編集で明らかにしました。「なぜ」も答えにとって重要であり、含まれるべきだと思います。
lugiorgi

0

短い配列をコレクションに変換する別の方法があります。

  1. shortをShortオブジェクト配列に変換
  2. Arrays.asListメソッドを使用してShort []をListに変換し、ストリームを使用してそれらを繰り返します。

以下のサンプルコードを参照してください、

Short[] shortarray = {0,1,2}; List<Short> shortList1 = Arrays.asList(shortarray); shortList1.stream().forEach(aShort -> {System.out.println(aShort);});

お役に立てれば。

ありがとうサンディ


OPは変換しshort[]ないShort[]
Karthikeyan Vaithilingam

実際には、Arraysクラスは現在、int、long、double、または任意のObject型のみをパラメーターと見なします。したがって、現時点では、Arraysクラスのストリームメソッドへのパラメーターとしては、簡単な答えは「不可能」です。注:Arrays.stream paramのサポートに関する私の意見は、私のドキュメントレビューのJava 1.8まで有効です。
サンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.