从HashMap如何使用java 8流忽略重复键和值

时间:2017-02-01 10:03:40

标签: java-8

我有任务元素列表,我需要创建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));

1 个答案:

答案 0 :(得分:0)

TL; DR

提供BinaryOperator作为toConcurrentMap收集器方法的第三个参数。操作员应决定如何处理重复项。最简单(也是最常见)的解决方案是忽略它们:

toConcurrentMap(Task::getTaskID, task -> task, (u, v) -> u)
// or
toConcurrentMap(Task::getTaskID, identity(), (u, v) -> u)

当您收集到Map(使用toMaptoConcurrentMap)时,可以在该方法中提供2到4个参数:

  1. Function<? super T, ? extends K> keyMapper (必需)

    将输入对象映射为键的函数。

  2. Function<? super T, ? extends V> BinaryOperator<U> valueMapper (必需)

    函数将输入对象映射为一个值。

  3. BinaryOperator<U> mergeFunction (可选)

    二进制运算符处理具有相同键的值。它接收两个值作为输入,您必须决定应在地图中保留哪个值。

    决策逻辑可能很复杂,尽管最常用的方法是选择第一个值:

    (u, v) -> u
    

    默认情况下,toMap方法使用throwingMerger

    (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }
    
  4. Supplier<M> mapSupplier (可选)

    提供Map实例的供应商。使用lambda可以提供如下所示的现有映射,但是不建议这样做,因为它会给函数收集器带来副作用:

    () -> yourExistingMap
    

    默认情况下,toMaptoConcurrentMap分别使用HashMap::newConcurrentHashMap::new