Collectors.toSet()和HashSet

时间:2015-05-06 16:33:28

标签: java java-8 java-stream collectors

采用以下示例代码:

Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());

我想要HashSet。将调试器带到代码中,我确实得到了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,这完全在其权利范围内,那么我的实施就会受到影响。

解决此问题的最佳做法是什么?

1 个答案:

答案 0 :(得分:90)

如果您想要保证HashSet,请使用Collectors.toCollection(HashSet::new)