是否有一个收集器收集到一个保序集?

Posted

技术标签:

【中文标题】是否有一个收集器收集到一个保序集?【英文标题】:Is there a Collector that collects to an order-preserving Set? 【发布时间】:2015-02-21 02:17:57 【问题描述】:

Collectors.toSet() 不保留顺序。我可以改用 Lists,但我想指出生成的集合不允许元素重复,这正是 Set 接口的用途。

【问题讨论】:

我不认为这样的事情存在。我知道我也需要一个,我必须自己写。 SortedSet 会起作用吗?如果没有,自定义是要走的路。 @AntonH 不,我更喜欢 O(1) 操作而不是 O(log n)。 I posted that code, 这不是您所需要的,但它可能会帮助您入门。 【参考方案1】:

您可以使用toCollection 并提供您想要的集合的具体实例。例如,如果您想保留广告订单:

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]
    

【讨论】:

很好,这正是我需要的,但我认为 Guava 的 ImmutableSet 在我的情况下会更好。关于如何制作收集到ImmutableSet 的收集器的任何想法?它的实例是用ImmutableSet.Builder 构建的,而不是Collection,所以我不知道在这种情况下如何为Collectors.toCollection() 创建Supplier @Susei 我会试着调查一下。另一种方法是返回一个不可修改的集合。例如:Set&lt;String&gt; linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new));linkedSet = Collections.unmodifiableSet(linkedSet); @Susei 我找到的最接近的:Set&lt;String&gt; set = list.stream().collect( ImmutableSet.Builder&lt;String&gt;::new, ImmutableSet.Builder&lt;String&gt;::add, (builder1, builder2) -&gt; builder1.addAll(builder2.build())).build(); 不确定用Collections.unmodifiableSet 包装结果集是否是更好的方法。 这是一个专门的问题,因为这已经离题了(当然,为了更好的答案需要更多代表):***.com/questions/27612165/… 太棒了。谢谢!

以上是关于是否有一个收集器收集到一个保序集?的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾回收

JVM-垃圾收集算法垃圾收集器内存分配和收集策略

进程连接到另一个进程以收集配置文件信息?

如何在批量收集循环中进行条件处理?

大数据之数据收集

第三章垃圾收集器与内存分配策略