java - 在 Java 8 中是否有更简洁的方法来执行此操作 - map 操作

标签 java lambda collections

集合映射的一个非常常见的操作是在键不存在时创建一个具有初始值的新集合,或者如果键存在,则对现有集合执行一些功能。以 Map<String, Set<Integer>> 为例,如果键不存在,则创建一个初始值为 1 的集合。如果键存在,则将值 map.size()+1 添加到集合中(或将此函数替换为其他一些简单的单行操作).在 Java 7 中,使用 if/else 很简单,但非常冗长。我只能想出下面的 Java 8 代码,它并没有好多少(实际上更糟,因为代码行更多)。有没有办法让它更简洁?

public void process(Map<String, Set<Integer>> m, String key) {
    m.compute(key, (k, v) -> {
        if (v == null) {
            v = new HashSet<>();
            v.add(1);
            return v;
        } else {
            v.add(v.size() + 1);
            return v;
        }
    });
}

最佳答案

这是另一种选择:

Set<Integer> set = m.computeIfAbsent (key , k -> new HashSet<> ());
set.add(set.size() + 1);

这是两个衬里(而不是一个)的唯一原因是需要获取 Set 的当前大小,以便决定向其中添加哪个值。

关于java - 在 Java 8 中是否有更简洁的方法来执行此操作 - map 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57044940/

相关文章:

java - 从另一个类中处理 JFrame

java - 如何在java中的json对象值中显示反斜杠 - 非法转义JSONException

java - 在 Timeline 对象的构造函数中使用 lambda 表达式会导致错误

java - TreeSet 不添加超过两个项目(对象)

Java8 : Create HashMap with character count of a String

java - 相当于 Java 中的 'where' fortran 关键字吗?

java - JUnit 测试 - 类调用其他类中的方法

f# - 如果F#支持void类型,为什么我需要使用单位类型?

java - 将非重复元素添加到 Java 8 功能样式中的现有键

c# - 如何在 C# 中最优雅地从匿名集合创建空集合?