从HashMap看如何使用Java8流忽略重复的键和值

从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) 这是我

我有一个任务元素列表,从中我需要创建hashMap 这里我的consenr是这样的,如果我放置了hashmap中存在的复制键,在这种情况下它应该忽略,继续添加剩余的对象

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