93

采用以下示例代码行:

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);
}

合同保证a Set,执行决定a HashSet;似乎有道理。但是,我的实现需要由 a 保证的恒定时间查找HashSet,而不仅仅是任何旧的Set. 如果实现toSet()决定使用 say a FooSet,这完全在其权利范围内,那么我的实现就会受到影响。

这个问题的最佳实践解决方案是什么?

4

1 回答 1

159

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

于 2015-05-06T16:35:43.890 回答