2014-12-22 9 views
54

Collectors.toSet() siparişi korumaz. Bunun yerine Listeleri kullanabilirdim, ancak sonuçta elde edilen koleksiyonun eleman çoğaltmasına izin vermediğini belirtmek isterim, bu da tam olarak Set arabiriminin ne için olduğunu gösteriyor.Sipariş koruyucu bir Set'e toplanan bir Toplayıcı var mı?

+0

Ben böyle bir şeyin varlığına düşünmüyorum. Benim de ihtiyacım olduğunu biliyorum ve kendim yazmalıydım. – markspace

+0

'SortedSet' çalışır mı? Değilse, özel gitmek için yoldur. – AntonH

+0

@AntonH Hayır, O (1) işlemlerini O (log n) ye tercih ederim. – gvlasov

cevap

109

toCollection'u kullanabilir ve istediğiniz kümenin somut örneğini sağlayabilirsiniz. Örneğin ekleme siparişini tutmak istiyorsanız: Örneğin

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

:

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

Güzel, tam olarak ihtiyacım olan şey, ama bence Guava'nın “ImmutableSet” durumu benim durumumda daha iyi olurdu. 'ImmutableSet' toplayan bir koleksiyoncu nasıl yapabilirim hakkında herhangi bir fikir? Örnekleri, bir 'Koleksiyon' olmayan bir 'ImmutableSet.Builder' ile inşa edilmiştir, bu yüzden bu durumda Collectors.toCollection() 'için bir' Tedarikçiyi 'nasıl yapacağınızı anlayamıyorum. – gvlasov

+0

@Susei Bakmaya çalışacağım. Bir alternatif, değiştirilemeyen bir setin iade edilmesi olacaktır. Örn: 'Set linkedSet = list.stream() topla (Collectors.toCollection (LinkedHashSet :: new)); ' linkedSet = Collections.unmodifiableSet (linkedSet); –

+0

@Susei En yakın buldum: 'Set . build (- set = list.stream() toplamak (> builder1.addAll (builder2.build()) ImmutableSet.Builder :: yeni, ImmutableSet.Builder ::, (Builder1, builder2) ekleyin).) '' Sonuç kümesini 'Collections.unmodifiableSet 'ile paketleyerek daha iyi bir yaklaşım olup olmadığından emin değil. –

İlgili konular