ฉันจะแปลง Java 8 IntStream เป็นรายการได้อย่างไร


283

ฉันกำลังดูเอกสารสำหรับIntStreamและฉันเห็นtoArrayวิธีการ แต่ไม่สามารถไปที่List<Integer>

แน่นอนมีวิธีการแปลงStreamเป็นList?


ลองลิงค์นี้: stackoverflow.com/questions/14830313/ …
Vaibhav Jain

2
@KarlRichter คำถามอื่นไม่ได้ให้รายการที่พิมพ์ นอกจากนี้คำถามนี้มาจากสี่ปีที่แล้วและมีคำตอบด้วย 300+ upvotes ทำไมเราถึงพยายามรวมตอนนี้
Eric Wilson

คำตอบ:


541

IntStream::boxed

IntStream::boxedเปลี่ยนเป็นIntStreama Stream<Integer>ซึ่งคุณสามารถcollectเปลี่ยนเป็นList:

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

boxedวิธีการแปลงintค่าดั้งเดิมของIntStreamเข้าไปในกระแสของIntegerวัตถุ คำว่า"มวย"ตั้งชื่อกระบวนการแปลงintIntegerดูออราเคิลกวดวิชา


1
@skiwi ฉันหมายความว่าคำตอบอื่น ๆ ทั้งหมดไม่จำเป็นหลังจากนี้เพราะพวกเขาจะไม่เป็นธรรมชาติ
Dmitry Ginzburg

1
ขอบคุณฉันยังไม่เห็นวิธีการชนิดบรรจุกล่องและมันทำงานเหมือนมีเสน่ห์
twreid

toListนอกจากนี้ผมคิดว่ารหัสนี้ได้รับเพียงเล็กน้อยสั้นชัดเจนและสวยถ้าคุณใช้การนำเข้าคงที่ของ static import java.util.stream.Collectors.toList;นี้จะกระทำโดยการวางต่อไปนี้ในหมู่การนำเข้าแฟ้ม: .collect(toList())จากนั้นการเรียกเก็บเพียงอ่าน
Lii

1
ใน Eclipse เป็นไปได้ที่จะทำให้ IDE เพิ่มการนำเข้าคงที่สำหรับวิธีการ นี้จะกระทำโดยการเพิ่มCollectorsระดับในการตั้งค่า -> Java -> แก้ไข -> เนื้อหา Assist -> รายการโปรด หลังจากนี้คุณจะต้องพิมพ์toLiที่ hit Ctr + Spaceเพื่อให้ IDE เติมtoListและเพิ่มการนำเข้าคงที่
Lii

2
ผมของฉันฉีกขาดเกี่ยวกับสิ่งที่ผิดพลาดกับสิ่งที่ฉันได้ลองขอขอบคุณสำหรับการชี้ให้เห็นboxed()ส่วน
K Raphael

16

คุณยังสามารถใช้ mapToObj () บนสตรีมซึ่งใช้ IntFunction และส่งคืนสตรีมที่มีค่าเป็นวัตถุซึ่งประกอบด้วยผลลัพธ์ของการใช้ฟังก์ชั่นที่กำหนดให้กับองค์ประกอบของสตรีมนี้

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

4
ในจังหวะประชดนี่คือสิ่งที่boxed()มอบหมายให้
โกโตะ

9

คุณสามารถใช้คอลเล็กชันดั้งเดิมที่มีอยู่ในEclipse Collectionsและหลีกเลี่ยงการชกมวย

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

หมายเหตุ: ฉันเป็นผู้บริจาคให้กับ Eclipse Collections


6
แม้ว่าคราสคอลเลกชันนี้มักจะเป็นประโยชน์มากนี้ไม่ได้มีลักษณะเช่นนั้นจะทำให้อะไรง่ายที่ทุกคน :)
เบน

1
ตั้งแต่ EC 9.0 คุณสามารถสร้างรายการดั้งเดิมจากสตรีมดั้งเดิม MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab

1
นี่คือสิ่งที่ฉันกำลังมองหา .. มวยสตรีมไปยัง Integer หรือเพื่อคัดค้านสิ่งต่าง ๆ
Vikash

2

ค้นหาตัวอย่างการค้นหากำลังสองของแต่ละองค์ประกอบ int โดยใช้ 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);

0

คุณสามารถใช้วิธีการเก็บรวบรวม:

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

ในความเป็นจริงนี่เป็นสิ่งที่ Java ทำเมื่อคุณเรียกใช้. collect (Collector.toList ()) บนสตรีมวัตถุ:

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

หมายเหตุ: พารามิเตอร์ที่สามจำเป็นเฉพาะเมื่อคุณต้องการรันการรวบรวมแบบขนานเท่านั้น สำหรับการรวบรวมตามลำดับที่ให้เพียงสองรายการแรกจะเพียงพอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.