Apakah ada Kolektor yang mengumpulkan ke Set pemelihara pesanan?

107

Collectors.toSet()tidak menjaga ketertiban. Saya dapat menggunakan Daftar sebagai gantinya, tetapi saya ingin menunjukkan bahwa koleksi yang dihasilkan tidak memungkinkan duplikasi elemen, yang memang untuk tujuan Setantarmuka.

gvlasov.dll
sumber
Saya tidak berpikir hal seperti itu ada. Saya tahu saya membutuhkannya juga, dan saya harus menulis sendiri.
markspace
Akan SortedSetberhasil? Jika tidak, kebiasaan adalah cara yang tepat.
AntonH
@ AntonH Tidak, saya lebih suka operasi O (1) daripada O (log n).
gvlasov
1
Saya memposting kode itu , ini bukan yang Anda butuhkan, tetapi mungkin dapat membantu Anda memulai.
markspace

Jawaban:

203

Anda dapat menggunakan toCollectiondan memberikan contoh konkret dari himpunan yang Anda inginkan. Misalnya jika Anda ingin menjaga urutan penyisipan:

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

Sebagai contoh:

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]
    }
}
Alexis C.
sumber
Bagus, itulah yang saya butuhkan, tapi saya pikir Jambu biji ImmutableSetakan lebih baik dalam kasus saya. Adakah ide tentang bagaimana saya bisa membuat kolektor yang mengoleksi ImmutableSet? Instansnya dibuat dengan ImmutableSet.Builderyang bukan a Collection, jadi saya tidak tahu bagaimana Anda akan membuat Supplieruntuk Collectors.toCollection()dalam kasus itu.
gvlasov
@Susei Saya akan mencoba untuk memeriksanya. Alternatifnya adalah mengembalikan set yang tidak dapat dimodifikasi. Contoh:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.
@Susei Yang paling dekat yang saya temukan: Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();Tidak yakin apakah itu pendekatan yang lebih baik dengan membungkus set yang dihasilkan dengan Collections.unmodifiableSet.
Alexis C.
Berikut adalah pertanyaan khusus karena itu sudah di luar topik (dan untuk perwakilan lebih banyak untuk jawaban yang bagus, tentu saja): stackoverflow.com/questions/27612165/…
gvlasov