2014-12-22 16 views
54

Collectors.toSet() không bảo vệ trật tự. Tôi có thể sử dụng danh sách thay vào đó, nhưng tôi muốn chỉ ra rằng các bộ sưu tập kết quả không cho phép sao chép phần tử, đó là chính xác những gì Set giao diện cho.Có một Bộ sưu tập nào thu thập được một bộ đơn đặt hàng không?

+0

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 tự viết. – markspace

+0

'SortedSet' có hoạt động không? Nếu không, tùy chỉnh là con đường để đi. – AntonH

+0

@AntonH Không, tôi muốn O (1) hoạt động với O (log n). – gvlasov

Trả lời

109

Bạn có thể sử dụng toCollection và cung cấp ví dụ cụ thể của tập hợp bạn muốn. Ví dụ, nếu bạn muốn giữ gìn trật 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] 
    } 
} 
+0

Thật tuyệt, đó chính xác là những gì tôi cần, nhưng tôi nghĩ rằng 'ImmutableSet' của Guava sẽ 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 instance của nó được xây dựng với một 'ImmutableSet.Builder' mà không phải là một' Collection', vì vậy tôi không thể tìm ra cách bạn tạo một 'Supplier' cho' Collectors.toCollection() 'trong trường hợp đó. – gvlasov

+0

@Susei Tôi sẽ cố gắng xem xét nó. Một thay thế sẽ là trả lại một tập hợp không thể sửa đổi được. Ví dụ: 'Set linkedSet = list.stream(). Collect (Collectors.toCollection (LinkedHashSet :: new));' 'linkedSet = Collections.unmodifiableSet (linkedSet);' –

+0

@Susei Gần nhất tôi tìm thấy: 'Set set = list.stream(). collect ( ImmutableSet.Builder :: mới, ImmutableSet.Builder :: thêm, (builder1, builder2) -> builder1.addAll (builder2.build())).) 'Không chắc chắn nếu đó là một cách tiếp cận tốt hơn bằng cách gói kết quả thiết lập với' Collections.unmodifiableSet'. –

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