Java 8 IntStream'i bir listeye nasıl dönüştürebilirim?


283

Dokümanlara bakıyorum IntStreamve bir toArrayyöntem görüyorum , ama doğrudan birList<Integer>

Şüphesiz bir dönüştürmek için bir yol yoktur Streama List?



2
@KarlRichter Diğer soru size yazılı bir liste vermiyor. Ayrıca, bu soru dört yıl önceydi ve 300+ upvotes ile bir cevabı var. Neden şimdi birleştirmeye çalışıyoruz?
Eric Wilson

Yanıtlar:


541

IntStream::boxed

IntStream::boxedBir döner IntStreambir içine Stream<Integer>, sonra hangi yapabilirsiniz collectbir içine List:

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

boxedYöntem dönüştüren intbir ilkel değerleri IntStreamakımı içine Integernesne. Kelimesi "boks" adları intIntegerdönüşüm süreci. Bkz. Oracle Eğitimi .


1
@skiwi Yani, diğer tüm cevapların bundan sonra gereksiz olduğu için doğal değiller.
Dmitry Ginzburg

1
Teşekkür ederim henüz kutulu yöntemi görmemişti ve bir cazibe gibi çalıştı.
twreid

Ek: Ben statik bir ithalat kullanırsanız bu kodlar biraz daha kısa, daha net ve güzel olur düşünüyorum toList. Bu dosyanın ithalat arasında aşağıdaki yerleştirerek yapılır: static import java.util.stream.Collectors.toList;. Sonra toplama çağrısı sadece okur .collect(toList()).
Lii

1
Eclipse'de IDE'nin yöntemler için statik bir içe aktarma eklemesi mümkündür. Bu, Collectorssınıfı Tercihler -> Java -> Editör -> İçerik Yardımı -> Sık Kullanılanlar'a ekleyerek yapılır . Bundan sonra , IDE'yi doldurmak ve statik içe aktarmayı eklemek için sadece toLihit Ctr + Space'e yazmanız gerekir toList.
Lii

2
Denediğim şeyde neyin yanlış olduğu hakkında saçlarımı yırtıyordu, boxed()parçayı işaret ettiğiniz için teşekkür ederim
K Raphael

16

Ayrıca bir IntFunction alan ve verilen işlevi bu akışın öğelerine uygulama sonuçlarından oluşan nesne değerli bir Akış döndüren bir Stream'de mapToObj () öğesini de kullanabilirsiniz.

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

4
Bir ironi darbesinde boxed(), delege olan budur.
Makoto

9

Eclipse Koleksiyonlarında bulunan ilkel koleksiyonları kullanabilir ve bokstan kaçınabilirsiniz.

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

Not: Eclipse Koleksiyonlarına katkıda bulunuyorum.


6
Eclipse Collections genellikle oldukça yararlı olsa da, bu hiç bir şeyi kolaylaştırıyor gibi görünmüyor :)
Ben

1
EC 9.0'dan bu yana, ilkel bir Akıştan ilkel bir liste oluşturabilirsiniz. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab

1
Aradığım şey budur .. int akışını Tamsayıya veya nesneye boks yapmak farklı bir şeydir
Vikash

2

Java 8 kullanarak her int öğesinin karesini bulmak için aşağıdaki örneği bulun: -

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

Koleksiyon yöntemini kullanabilirsiniz:

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

Aslında, bir nesne akışında .collect (Collectors.toList ()) öğesini çağırdığınızda Java'nın yaptığı tam olarak budur:

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

Not: Üçüncü parametre yalnızca paralel koleksiyon çalıştırmak istiyorsanız gereklidir; sadece ilk ikisini sağlayan sıralı toplama için yeterli olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.