Bagaimana cara mengonversi Java 8 IntStream ke Daftar?

283

Saya melihat dokumen untuk IntStream, dan saya melihat toArraymetode, tetapi tidak ada cara untuk langsung keList<Integer>

Tentunya ada cara untuk mengkonversi Streamke List?

Eric Wilson
sumber
Coba tautan ini: stackoverflow.com/questions/14830313/…
Vaibhav Jain
2
@KarlRichter Pertanyaan lain tidak memberi Anda daftar yang diketik. Selain itu, pertanyaan ini berasal dari empat tahun lalu, dan memiliki jawaban dengan 300+ peningkatan. Mengapa kita mencoba menggabungkannya sekarang?
Eric Wilson

Jawaban:

541

IntStream::boxed

IntStream::boxedmengubah suatu IntStreammenjadi Stream<Integer>, yang kemudian Anda bisa collectmenjadi List:

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

The boxedMetode mengubah intnilai-nilai primitif dari IntStreamke dalam aliran Integerobjek. Kata "tinju" menamai proses konversi intInteger. Lihat Tutorial Oracle .

Ian Roberts
sumber
1
@skiwi maksud saya, bahwa semua jawaban lain tidak diperlukan setelah yang ini karena mereka tidak begitu alami.
Dmitry Ginzburg
1
Terima kasih, saya belum melihat metode kemas dan itu bekerja seperti pesona.
twreid
Tambahan: Saya pikir kode ini menjadi sedikit lebih pendek, lebih jelas dan lebih cantik jika Anda menggunakan impor statis toList. Hal ini dilakukan dengan menempatkan berikut di antara impor file: static import java.util.stream.Collectors.toList;. Kemudian panggilan kumpulkan hanya berbunyi .collect(toList()).
Lii
1
Dalam Eclipse dimungkinkan untuk membuat IDE menambahkan impor statis untuk metode. Ini dilakukan dengan menambahkan Collectorskelas di Preferensi -> Java -> Editor -> Content Assist -> Favorites . Setelah ini, Anda hanya perlu mengetik toLidi tekan Ctr + Space untuk mengisi IDE toListdan menambahkan impor statis.
Lii
2
Merobek rambut saya tentang apa yang salah dengan apa yang saya coba, terima kasih telah menunjukkan boxed()bagian
K Raphael
16

Anda juga bisa menggunakan mapToObj () pada Stream, yang mengambil IntFunction dan mengembalikan Stream bernilai objek yang terdiri dari hasil penerapan fungsi yang diberikan ke elemen stream ini.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
Ida Bucić
sumber
4
Dalam ironi, inilah tujuan boxed()delegasi.
Makoto
9

Anda dapat menggunakan koleksi primitif yang tersedia di Eclipse Collections dan menghindari tinju.

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

Catatan: Saya adalah kontributor untuk Eclipse Collections.

Nikhil Nanivadekar
sumber
6
Meskipun Eclipse Collections biasanya cukup membantu, ini sepertinya tidak membuat semuanya menjadi lebih mudah :)
Ben
1
Sejak EC 9.0, Anda dapat membuat daftar primitif dari Stream primitif. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab
1
Inilah yang saya cari .. tinju aliran int ke Integer atau ke objek adalah hal yang berbeda
Vikash
2

Temukan contoh berikut untuk menemukan kuadrat dari setiap elemen int menggunakan Java 8: -

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);
Vikash
sumber
0

Anda dapat menggunakan metode kumpulkan:

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

Faktanya, ini hampir persis dengan apa yang dilakukan Java ketika Anda memanggil .collect (Collectors.toList ()) pada aliran objek:

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

Catatan: Parameter ketiga hanya diperlukan jika Anda ingin menjalankan pengumpulan paralel; untuk koleksi berurutan menyediakan dua saja sudah cukup.

Harry Jones
sumber