Collectors.toSet()和HashSet
采取以下行示例代码:
Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());
我想要一个HashSet
。 把一个debugging器的代码,我确实得到一个HashSet
。 我看了一下java.util.stream.Collectors.toSet()
来观察下面的代码:
public static <T> Collector<T, ?, Set<T>> toSet() { return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, (left, right) -> { left.addAll(right); return left; }, CH_UNORDERED_ID); }
合约保证一个Set
,实现决定一个HashSet
; 看起来合理。 但是,我的实现需要由HashSet
保证的恒定时间查找,而不仅仅是任何旧的Set
。 如果toSet()
的实现决定使用FooSet
,这完全在它的权限之内,那么我的实现就会受到影响。
这个问题的最佳实践解决scheme是什么?
如果你想保证HashSet
,使用Collectors.toCollection(HashSet::new)
。