Java 8 IntStreamをリストに変換するにはどうすればよいですか?


283

のドキュメントを調べていIntStreamますが、toArrayメソッドが表示されていますが、直接List<Integer>

確かにa Streamをa に変換する方法はありListますか?


:このリンク試してみてくださいstackoverflow.com/questions/14830313/...
バイバブジャイナ

2
@KarlRichterもう1つの質問では、入力したリストは表示されません。また、この質問は4年前のもので、300以上の賛成票で回答されています。なぜ今それをマージしようとしているのですか?
エリックウィルソン

回答:


541

IntStream::boxed

IntStream::boxedをにIntStream変換しStream<Integer>、次ににcollect変換できますList

theIntStream.boxed().collect(Collectors.toList())

このboxedメソッドは、のintプリミティブ値IntStreamIntegerオブジェクトのストリームに変換します。「ボクシング」という言葉は、intInteger変換プロセスを指しています。Oracleチュートリアルを参照してください。


1
@skiwiつまり、他のすべての回答はあまり自然ではないため、この回答の後は不要です。
ドミトリーギン

1
箱入りの方法をまだ見ていないので、ありがとうございます。
twreid

さらに:の静的インポートを使用すると、このコードは少し短く、明確で見栄えがよくなると思いますtoList。これは、ファイルのインポートに以下を配置することによって行われますstatic import java.util.stream.Collectors.toList;。次に、collect呼び出しはを読み取ります.collect(toList())
Lii

1
Eclipseでは、IDEにメソッドの静的インポートを追加さ​​せることができます。これはCollectors、「設定」 ->「Java」 ->「エディター」 ->「コンテンツ・アシスト」 ->「お気に入り」にクラスを追加することによって行われます。この後toLi、ヒットCtr + Spaceで入力するだけで、IDEにtoList入力して静的インポートを追加できます。
Lii

2
私が試したことのどこが悪いのか髪を引き裂いていた、そのboxed()部分を指摘してくれてありがとう
K Raphael

16

StreamでmapToObj()を使用することもできます。これは、IntFunctionを受け取り、指定された関数をこのストリームの要素に適用した結果で構成されるオブジェクト値のStreamを返します。

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

4
皮肉なことに、これboxed()は委任されていることです。

9

Eclipseコレクションで利用可能なプリミティブコレクションを使用して、ボックス化を回避できます。

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

注:私はEclipseコレクションの寄稿者です。


6
Eclipseコレクションは通常、非常に役立ちますが、これは何かを簡単にするものではないようです:)
Ben

1
EC 9.0以降、プリミティブストリームからプリミティブリストを作成できます。 MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
ドナルドラーブ

1
これは私が探していたものです.. intストリームをIntegerまたはオブジェクトにボックス化するのは別のことです
Vikash

2

Java 8を使用して各int要素の四角を見つける次の例を見つけてください。

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

0

collectメソッドを使用できます。

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

実際、これは、オブジェクトストリームで.collect(Collectors.toList())を呼び出したときにJavaが実行していることとほぼ同じです。

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

注:3番目のパラメーターは、並列収集を実行する場合にのみ必要です。最初の2つだけを提供する順次コレクションの場合は十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.