2014-11-11 19 views
6

Tôi muốn đưa luồng vào danh sách bất biến. Sự khác biệt giữa các cách tiếp cận sau và cái nào tốt hơn so với phối cảnh hiệu suất?Cách tốt nhất để thu thập Dòng Java-8 tới Guava ImmutableList

  1. collect(Collectors.collectingAndThen(Collectors.toList(), ImmutableList::copyOf));

  2. ImmutableList.copyOf(stream.iterator());

  3. collect(Collector.of( ImmutableList.Builder<Path>::new, ImmutableList.Builder<Path>::add, (l, r) -> l.addAll(r.build()), ImmutableList.Builder<Path>::build) );

Một vài chi tiết các thông số cho hiệu suất hoặc hiệu quả,

  1. Có thể có nhiều mục nhập trong danh sách/bộ sưu tập.

  2. Nếu tôi muốn thiết lập được sắp xếp, sử dụng thao tác trung gian ".sorted()" với bộ so sánh tùy chỉnh.

  3. do đó, những gì nếu tôi thêm .parallel() vào dòng
+0

liên quan: [Làm thế nào tôi có thể thu thập một dòng Java 8 thành ổi ImmutableCollection?] (Https: //stackoverflow.com/questions/29013250/how-can-i-collect-a-java-8-stream-into-a-guava-immutablecollection) –

Trả lời

2

Tôi mong đợi 1) là hiệu quả nhất: thông qua các nhà xây dựng bổ sung có vẻ ít dễ đọc hơn và không thể giành chiến thắng trên bình thường toList() và sao chép từ thông tin định kích thước loại bỏ vòng lặp.

(Nhưng Ổi đang nghiên cứu thêm hỗ trợ cho Java 8 điều như thế này, mà bạn có thể chỉ chờ đợi.)

+0

cảm ơn, bạn có thể vui lòng giải thích "sao chép từ các thông tin định kích thước của trình loại bỏ vòng lặp" – user3169330

+0

Một 'Stream.iterator()' không biết kích thước của nó. Đi qua 'toList()' sẽ cho bạn một danh sách có kích thước. Mặc dù vậy, có thể lập luận rằng bạn đang mất thông tin kích thước khi bạn xây dựng 'Danh sách', nhưng bạn có nó khi bạn sao chép nó vào danh sách' ImmutableList'. –

3

Đối với hiệu năng hệ thống, bạn cần phải đánh giá nó.

Để có hiệu suất lập trình, hãy sử dụng cách rõ ràng nhất. Từ sự xuất hiện một mình, tôi thích thứ hai tốt nhất, và tôi thấy không có sự kém hiệu quả rõ ràng ở đó.

Các vấn đề liên quan