Làm cách nào để chuyển đổi IntStream Java 8 thành Danh sách?


283

Tôi đang xem các tài liệu cho IntStreamvà tôi thấy một toArrayphương pháp, nhưng không có cách nào để đi thẳng đếnList<Integer>

Chắc chắn có một cách để chuyển đổi Streama List?



2
@KarlRichter Câu hỏi khác không cung cấp cho bạn một danh sách đánh máy. Ngoài ra, câu hỏi này là từ bốn năm trước, và đã có câu trả lời với hơn 300 lượt upvote. Tại sao chúng ta cố gắng hợp nhất nó bây giờ?
Eric Wilson

Câu trả lời:


541

IntStream::boxed

IntStream::boxedbiến một IntStreamthành một Stream<Integer>, mà sau đó bạn có thể collectthành một List:

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

Các boxedphương pháp chuyển đổi các intgiá trị nguyên thủy của một IntStreamthành một dòng suối của Integercác đối tượng. Từ "đấm bốc" tên các intIntegerquá trình chuyển đổi. Xem Hướng dẫn của Oracle .


1
@skiwi Ý tôi là, tất cả các câu trả lời khác là không cần thiết sau câu này vì chúng sẽ không tự nhiên lắm.
Dmitry Ginzburg

1
Cảm ơn bạn tôi đã không nhìn thấy phương pháp đóng hộp và nó hoạt động như một bùa mê.
twreid

Bổ sung: Tôi nghĩ rằng mã này sẽ ngắn hơn một chút, rõ ràng hơn và đẹp hơn nếu bạn sử dụng nhập khẩu tĩnh toList. Điều này được thực hiện bằng cách đặt các mục sau trong số các tệp nhập : static import java.util.stream.Collectors.toList;. Sau đó, cuộc gọi thu thập chỉ đọc .collect(toList()).
Lii

1
Trong Eclipse, có thể làm cho IDE thêm một nhập tĩnh cho các phương thức. Điều này được thực hiện bằng cách thêm Collectorslớp trong Tùy chọn -> Java -> Trình chỉnh sửa -> Hỗ trợ nội dung -> Mục ưa thích . Sau này, bạn chỉ phải gõ toLitại hit Ctr + Space để điền vào IDE toListvà thêm nhập tĩnh.
Lii

2
Đã xé tóc tôi về những gì sai với những gì tôi đã cố gắng, cảm ơn bạn đã chỉ ra boxed()phần
K Raphael

16

Bạn cũng có thể sử dụng mapToObj () trên Luồng, trong đó có một IntFactor và trả về một luồng có giá trị đối tượng bao gồm các kết quả của việc áp dụng hàm đã cho cho các phần tử của luồng này.

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

4
Trong một đột quỵ trớ trêu, đây là những gì boxed()được ủy thác.
Makoto

9

Bạn có thể sử dụng các bộ sưu tập nguyên thủy có sẵn trong Bộ sưu tập Eclipse và tránh đấm bốc.

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

Lưu ý: Tôi là người đóng góp cho Bộ sưu tập Eclipse.


6
Mặc dù Bộ sưu tập Eclipse thường khá hữu ích, nhưng điều này không có vẻ gì là dễ dàng hơn cả :)
Ben

1
Kể từ EC 9.0, bạn có thể xây dựng một danh sách nguyên thủy từ Luồng nguyên thủy. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab

1
Đây là những gì tôi đang tìm kiếm .. đấm bốc luồng int vào Integer hoặc phản đối là điều khác biệt
Vikash

2

Tìm ví dụ về việc tìm bình phương của mỗi phần tử int bằng 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

Bạn có thể sử dụng phương pháp thu thập:

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

Trong thực tế, đây gần như chính xác những gì Java đang làm khi bạn gọi .collect (Collector.toList ()) trên luồng đối tượng:

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

Lưu ý: Tham số thứ ba chỉ được yêu cầu nếu bạn muốn chạy bộ sưu tập song song; cho bộ sưu tập tuần tự chỉ cung cấp hai cái đầu tiên là đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.