从HashMap看如何使用Java8流忽略重复的键和值
我有一个任务元素列表,从中我需要创建hashMap 这里我的consenr是这样的,如果我放置了hashmap中存在的复制键,在这种情况下它应该忽略,继续添加剩余的对象从HashMap看如何使用Java8流忽略重复的键和值,java,collections,java-8,hashmap,java-stream,Java,Collections,Java 8,Hashmap,Java Stream,我有一个任务元素列表,从中我需要创建hashMap 这里我的consenr是这样的,如果我放置了hashmap中存在的复制键,在这种情况下它应该忽略,继续添加剩余的对象 private static Map<String, Task> currentRunningTask = new HashMap<String, Task>(); 如果我尝试添加重复的密钥,如 (t2,task2) 忽略键和值。结果应该是 (t1,task1) (t2,task2) 这是我
private static Map<String, Task> currentRunningTask = new HashMap<String, Task>();
如果我尝试添加重复的密钥,如
(t2,task2)
忽略键和值。结果应该是
(t1,task1)
(t2,task2)
这是我写的代码
currentRunningTask = tasksList.stream()
.collect(Collectors.toConcurrentMap(Task::getTaskID, task -> task));
TL;博士
提供一个BinaryOperator
作为toConcurrentMap
收集器方法的第三个参数。操作员应决定如何处理重复项。最简单(也是最常见)的解决方案是忽略它们:
toConcurrentMap(Task::getTaskID, task -> task, (u, v) -> u)
// or
toConcurrentMap(Task::getTaskID, identity(), (u, v) -> u)
当收集到
映射中时(使用toMap
或toConcurrentMap
),可以向该方法提供2到4个参数:
function使用Collectors.toConcurrentMap(Task::getTaskID,Task->Task,(a,b)->a)
提供的解决方案工作,在任务列表中再次关注类似问题。提供的解决方案工作,在任务列表中再次关注类似问题,如果重复的task2是Xobject类型的实例,将其附加到同一个键对应的值第三个参数,即(a,b)->a
告诉如何处理映射到同一个键的两个值a
和b
是两个值。仅映射到a
意味着保留旧值。你可以把它改成你想要的任何逻辑。
toConcurrentMap(Task::getTaskID, task -> task, (u, v) -> u)
// or
toConcurrentMap(Task::getTaskID, identity(), (u, v) -> u)
(u, v) -> u
(u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }
() -> yourExistingMap