我想通过Java 8 和接口将a Map
转换为ConcurrentHashMap
via ,我可以使用两个选项。Stream``Collector
首先:
Map<Integer, String> mb = persons.stream()
.collect(Collectors.toMap(
p -> p.age,
p -> p.name,
(name1, name2) -> name1+";"+name2,
ConcurrentHashMap::new));
第二个:
Map<Integer, String> mb1 = persons.stream()
.collect(Collectors.toConcurrentMap(
p -> p.age,
p -> p.name));
哪个是更好的选择?什么时候应该使用每个选项?
在处理并行流时,它们之间是有区别的。
toMap
->是非并行收集器
toConcurrentMap
->是并发收集器(这可以从它们的特征中看出)。
区别在于 toMap 将创建多个中间结果,然后将其合并在一起(多次调用该Collector的Supplier),而 toConcurrentMap
将创建 单个 结果,并且每个Thread都会向其抛出结果(此类的Supplier收藏家只会被调用一次)
为什么这很重要?这处理插入顺序(如果有的话)。
toMap 将通过合并多个中间结果按遇到的顺序在结果Map中插入值(该收集器的供应商称为“多次”,也称为“合并器”)
toConcurrentMap
将通过将所有元素扔到公共结果容器(在这种情况下为ConcurrentHashMap)来以任何顺序(未定义)收集元素。供应商仅被调用一次,累加器被调用多次,而合并器则从未被调用。
这里的一个小警告是CONCURRENT
收集器不调用合并:流必须具有UNORDERED
标志-
通过unordered()
显式调用或当流的源未排序时(Set
例如)。
问题内容: 我有一个地图,该地图将同时被多个线程修改。 Java API中似乎有三种不同的同步Map实现: Hashtable Collections.synchronizedMap(Map) ConcurrentHashMap 据我了解,这是一个旧的实现(扩展了过时的类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。 但是其他两个呢?
我们都知道
我正在寻找编译过程中使用的默认编译器标志。因此,我使用了命令
这两种方法有什么区别:和? 请举个例子。
问题内容: 我知道映射是将键映射到值的数据结构。字典不一样吗?地图和字典1有什么区别? 1.我不是要问用X或Y语言定义它们(这似乎是人们通常在SO上要求的语言),我想知道它们在理论上有何不同。 问题答案: 同一件事的两个术语: Java,C ++使用“地图” .Net,Python使用“字典” PHP使用“关联数组” “映射”是正确的数学术语,但是避免使用它,因为它在函数式编程中具有单独的含义。
问题内容: 下面的示例代码使用bimg将pdf转换为jpeg 。 但只会转换的第1页。 有什么方法可以转换成包含多个页面的图像。 问题答案: bimg使用libvips,并可能加载PDF。不幸的是,libvips加载PDF的默认设置是仅加载一页。除非您想修改bimg(供应商,贡献,破解源代码等),否则您很不幸。 不是问题的答案(不使用bimg),但是您可以改用imagemagick,