java - Collectors.toSet() 和 HashSet

标签 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,这是完全在其权利范围内的,那么我的实现就会受到影响。

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

最佳答案

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

关于java - Collectors.toSet() 和 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082555/

相关文章:

java - MemSQL 与 H2 对比

java - 如何处理java代码的错误

java - 从 lambda 调用默认方法

java - 计算与流的正则表达式匹配

Java 流 API : why the distinction between sequential and parallel execution mode?

java - 读取文件,一次一行并运行代码

Java 绘制图像 JPanel : Working but weird

java - 从 JDK 1.5.0_06 迁移到 1.8.0_66 - 替换已弃用的 Java JPEG 类

java - 使用 Java 8 迭代时从列表对象中删除空间

Java从列表中删除某些属性重复的条目