Có Người thu thập nào thu thập vào Bộ bảo quản đơn đặt hàng không?


107

Collectors.toSet()không giữ gìn trật tự. Thay vào đó, tôi có thể sử dụng Danh sách, nhưng tôi muốn chỉ ra rằng tập hợp kết quả không cho phép sao chép phần tử, đó chính xác Setlà giao diện dành cho.


Tôi không nghĩ rằng một điều như vậy tồn tại. Tôi biết tôi cũng cần một cái, và tôi phải viết cho riêng mình.
markspace

Sẽ SortedSetlàm việc? Nếu không, tùy chỉnh là cách để đi.
AntonH

@AntonH Không, tôi thích phép toán O (1) hơn O (log n).
gvlasov

1
Tôi đã đăng mã đó , nó không phải là chính xác những gì bạn cần nhưng nó có thể giúp bạn bắt đầu.
markspace

Câu trả lời:


203

Bạn có thể sử dụng toCollectionvà cung cấp phiên bản cụ thể của tập hợp bạn muốn. Ví dụ: nếu bạn muốn giữ thứ tự chèn:

Set<MyClass> set = myStream.collect(Collectors.toCollection(LinkedHashSet::new));

Ví dụ:

public class Test {    
    public static final void main(String[] args) {
        List<String> list = Arrays.asList("b", "c", "a");

        Set<String> linkedSet = 
            list.stream().collect(Collectors.toCollection(LinkedHashSet::new));

        Set<String> collectorToSet = 
            list.stream().collect(Collectors.toSet());

        System.out.println(linkedSet); //[b, c, a]
        System.out.println(collectorToSet); //[a, b, c]
    }
}

Tốt, đó chính xác là những gì tôi cần, nhưng tôi nghĩ Guava ImmutableSetsẽ tốt hơn trong trường hợp của tôi. Bất kỳ ý tưởng về cách tôi có thể làm cho một nhà sưu tập thu thập ImmutableSet? Các phiên bản của nó được xây dựng với một ImmutableSet.Builderkhông phải là a Collection, vì vậy tôi không thể tìm ra cách bạn sẽ tạo ra một Suppliercho Collectors.toCollection()trong trường hợp đó.
gvlasov

@Susei Tôi sẽ cố gắng xem xét nó. Một giải pháp thay thế sẽ là trả về một tập hợp không thể sửa đổi. Ví dụ:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.

@Susei Điều gần nhất mà tôi tìm thấy: Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();Không chắc đó có phải là cách tiếp cận tốt hơn không bằng cách gói tập hợp kết quả với Collections.unmodifiableSet.
Alexis C.

Đây là một câu hỏi dành riêng vì nó đã lạc đề (tất nhiên là để có thêm đại diện cho những câu trả lời tuyệt vời): stackoverflow.com/questions/27612165/…
gvlasov
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.