是否有一个收集器收集到一个保序集?
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<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new));
linkedSet = Collections.unmodifiableSet(linkedSet);
@Susei 我找到的最接近的:Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();
不确定用Collections.unmodifiableSet
包装结果集是否是更好的方法。
这是一个专门的问题,因为这已经离题了(当然,为了更好的答案需要更多代表):***.com/questions/27612165/…
太棒了。谢谢!以上是关于是否有一个收集器收集到一个保序集?的主要内容,如果未能解决你的问题,请参考以下文章