【问题标题】: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, 这不是您所需要的,但它可能会帮助您入门。

标签: java java-8 collectors


【解决方案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 包装结果集是否是更好的方法。
  • 这是一个专门的问题,因为这已经离题了(当然,为了更好的答案需要更多代表):stackoverflow.com/questions/27612165/…
  • 太棒了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2022-12-06
  • 2015-02-13
  • 2016-02-29
  • 2020-08-20
  • 2016-03-12
  • 2016-09-12
相关资源
最近更新 更多