繁体   English   中英

集合函数方法调用get,put等吗?

[英]Do Collections functional methods call get, put, etc?

我花了很多年时间使用Java 1.6(维护传统工具)并且刚刚开始迁移到1.8。 一个重大变化是java.util.Collections套件中的功能方法。 对我来说最大的担忧是我有几个集合扩展,它们需要仔细检查或修改算法。 默认方法是调用已经定义的put(..),get(...),remove(..)等函数还是我必须做一个重大的返工来使这个工作?

例如(忽略空检查等等只包含值<= 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之前的接口方法的方法是,如果你能以某种方式委托接口中的默认方法实现(在本例中为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方法调用的常规规则) )。

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

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);
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM