计算映射 - 将元素添加到现有列表或创建新列表并将其添加到其中

6

我有这段代码:

private static void computeMapAddition(Map<String, List<XXX>> objectMap,
    XXX objectToAdd, String key) {
    if (objectMap.containsKey(key)) {
        List<XXX> objectList = objectMap
            .get(key);
        objectList.add(objectToAdd);
    } else {
        List<XXX> objectList = new ArrayList<>();
        objectList.add(objectToAdd);
        objectMap.put(key, objectList);
    }
}

这段代码的作用:

1)如果map包含key,则检索值 - 该值是一个列表,并将元素添加到该列表中(它可能已经有很多元素)

2)如果map不包含key,则创建新列表,将元素添加到新创建的列表中,并将(key,value)放入map中

是否有办法使用Java 8使其更简洁?

3个回答

11

Java 8在Map接口中添加了computeIfAbsent方法。它可以完全满足您的需求:

// return the list if already present or make a new one, insert into the map 
// and return the newly created one
List<XXX> objectList = objectMap.computeIfAbsent(key, k -> new ArrayList<>());

// add new object to list
objectList.add(objectToAdd);

或者您可以将它们结合在一起,如下所示:
objectMap.computeIfAbsent(key, k -> new ArrayList<>()).add(objectToAdd);

2
但是,如果它存在,我希望将元素添加到已经存在的值(列表)中,而这段代码无法实现。 - doublemc
5
那正是它的作用。 - Misha
它不会这样做,当它们结合在一起时。 - BijanE

1

在@misha的回答中补充一些内容。

我们可以使用两个选项:

 Map<Integer, List<String>> map = new HashMap<>();
  1. computeIfAbsent (preferred)
 map.computeIfAbsent(1, ArrayList::new).add("b");
  1. compute
 map.compute(1, (k, v) -> {
            v = v != null ? v : new ArrayList<>();
            v.add("b");
            return v;
        });

1
这对我有效:
 map.compute(key, (k, v) -> {
            v = v != null ? new ArrayList<>(v) : new ArrayList<>();
            v.add("text");
            return v;
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接