java - 集合功能方法是否调用 get、put 等?

标签 java collections lambda java-8

我多年来一直使用 Java 1.6(维护遗留工具),现在才刚刚开始迁移到 1.8。一个很大的变化是 java.util.Collections 套件中的功能方法。我最担心的是我有几个集合扩展,它们在修改时应用了仔细的检查或算法。默认方法是否调用已定义的 put(..)、get(...)、remove(..) 等函数,或者我是否必须进行重大修改才能使其正常工作?

例如(忽略 null 检查等。只包含值 <= 10 的映射)

public class LimitedMap extends HashMap<String, Integer>{
    @Override
    public Integer put(String key, Integer value){
        if(value> 10) throw new IllegalArgumentException();
        return super.put(key, value);
    }

    @Override
    public Integer computeIfAbsent(String key, Function<? super String, ? extends Integer> mappingFunction) {
        return super.computeIfAbsent(key, mappingFunction);
    }
}

有了这对函数:我是否还需要做一个详细的覆盖并将新的检查放入 computeIfAbsent 函数中?

最佳答案

您可以确定只能使用 Java 8 之前的接口(interface)方法的唯一方法是,如果您可以某种方式委托(delegate)给接口(interface) 中的默认方法实现(在本例中为 Map<K, V> ).

也就是说,如果您可以编写如下内容(您不能)。

public class LimitedMap extends HashMap<String, Integer> {

    @Override
    public Integer computeIfAbsent(String key,
            Function<? super String, ? extends Integer> mappingFunction) {

        return Map.super.computeIfAbsent(key, mappingFunction);
    }
}

不幸的是,这是不合法的,因为您只能调用您覆盖的方法(这里是来自 HashMap<String, Integer> 的方法),而不是继承方法可能已覆盖的方法(这些是 super 的正常规则)方法调用)。

因此,对于您的情况,我看到的唯一解决方法是在辅助类中创建接口(interface)默认方法实现的副本,如下所示:

public class Maps {

    public static <K, V> V computeIfAbsent(Map<K, V> map,
            K key, Function<? super K, ? extends V> mappingFunction) {
        Objects.requireNonNull(mappingFunction);
        V v;
        if ((v = map.get(key)) == null) {
            V newValue;
            if ((newValue = mappingFunction.apply(key)) != null) {
                map.put(key, newValue);
                return newValue;
            }
        }

        return v;
    }
}

这是来自 java.util.Map 的实现作为由附加参数增强的静态方法 map用于实例操作。

有了这样的辅助类,您现在可以编写

public class LimitedMap extends HashMap<String, Integer> {

    @Override
    public Integer computeIfAbsent(String key,
            Function<? super String, ? extends Integer> mappingFunction) {

        return Maps.computeIfAbsent(this, key, mappingFunction);
    }
}

这不是最漂亮的解决方案,但应该只需付出有限的努力即可实现。

关于java - 集合功能方法是否调用 get、put 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44218254/

相关文章:

java - 如何为单个类的多次运行创建一个数组列表常量?

java - HQL 中的 Collection.contains(Enum.Value)?

c# - 参数化 LINQ GroupBy

java - 日历格式问题

java - 使用 ANTLR 4 测试预期的错误消息

java - 2d ArrayLists - 为什么将一个对象添加到一个子列表会将同一对象添加到所有子列表?

java - HashSet是通过HashMap实例实现的

node.js - @aws-sdk/client-lambda] - 调用 Lambda - Unit8Array 中的有效负载响应 - 转换为字符串

c# - 在 C# 中在运行时构造一个函数

java - 使用 gson 解析 JSON 数组