我有任务元素列表,我需要创建hashMap 在这里,我的意思是,如果我把重复键存在于hashmap中,在这种情况下它应该忽略,继续添加剩余的对象。
private static Map<String, Task> currentRunningTask = new HashMap<String, Task>();
currentRunningTask具有以下元素,如
(t1,task1)
(t2,task2)
如果我想尝试添加重复键,如
(t2,task2)
忽略键和值。结果应该是
(t1,task1)
(t2,task2)
这是我写的代码
currentRunningTask = tasksList.stream()
.collect(Collectors.toConcurrentMap(Task::getTaskID, task -> task));
答案 0 :(得分:0)
TL; DR
提供BinaryOperator
作为toConcurrentMap
收集器方法的第三个参数。操作员应决定如何处理重复项。最简单(也是最常见)的解决方案是忽略它们:
toConcurrentMap(Task::getTaskID, task -> task, (u, v) -> u)
// or
toConcurrentMap(Task::getTaskID, identity(), (u, v) -> u)
当您收集到Map
(使用toMap
或toConcurrentMap
)时,可以在该方法中提供2到4个参数:
Function<? super T, ? extends K> keyMapper
(必需)
将输入对象映射为键的函数。
Function<? super T, ? extends V> BinaryOperator<U> valueMapper
(必需)
函数将输入对象映射为一个值。
BinaryOperator<U> mergeFunction
(可选)
二进制运算符处理具有相同键的值。它接收两个值作为输入,您必须决定应在地图中保留哪个值。
决策逻辑可能很复杂,尽管最常用的方法是选择第一个值:
(u, v) -> u
默认情况下,toMap
方法使用throwingMerger
:
(u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }
Supplier<M> mapSupplier
(可选)
提供Map
实例的供应商。使用lambda可以提供如下所示的现有映射,但是不建议这样做,因为它会给函数收集器带来副作用:
() -> yourExistingMap
默认情况下,toMap
和toConcurrentMap
分别使用HashMap::new
和ConcurrentHashMap::new
。