Collectors.toSet() 和 HashSet
Collectors.toSet() and HashSet
取下面一行示例代码:
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
,我的实施就会受到损害。
这个问题的最佳实践解决方案是什么?
如果您想要保证 HashSet
,请使用 Collectors.toCollection(HashSet::new)
。
取下面一行示例代码:
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
,我的实施就会受到损害。
这个问题的最佳实践解决方案是什么?
如果您想要保证 HashSet
,请使用 Collectors.toCollection(HashSet::new)
。