API 24以下设备替代getOrDefault的方法 Android

15

我正在编写一个Android应用程序,使用了一个包含如下循环的Java类:

for (Set<I> itemset : candidateList2) {
    supportCountMap.put(itemset, supportCountMap.getOrDefault(itemset,0)+ 1);
}

我收到一个警告:“调用需要API级别24(当前最低为16)”在这个方法上:

supportCountMap.getOrDefault(itemset,0)+1);

有没有任何变通方法可以使此方法在SDK版本低于24的手机上运行,例如Marshmallow(23)和Lollipop(21)?

3个回答

26

Kotlin:只需使用 elvis 运算符:

  val value = map[key] ?: 0

如果map[key]为空,则值为0。


6

我建议创建MapCompat类,复制Map.getOrDefault的实现,并将你的map作为额外参数传入:

public class MapCompat {

    public static <K, V> V getOrDefault(@NonNull Map<K, V> map, K key, V defaultValue) {
        V v;
        return (((v = map.get(key)) != null) || map.containsKey(key))
                ? v
                : defaultValue;
    }
}

这种模式在IT技术中被广泛使用,比如Android支持库中就有很多应用,例如ContextCompat.getColor就是一个很好的例子。


4

您总是可以自己实现相同的逻辑:

for (Set<I> itemset : candidateList2) {
    Integer value = supportCountMap.get(itemset);
    if (value == null) {
        value = 0;
    }
    supportCountMap.put(itemset, value + 1);
}

谢谢,这个工作做得很好。只有一个问题,基于 @Bubletan 的建议,方法实现会检查 HashMap 是否包含键,那么在上面的代码片段中,结合检查值是否为空,这是否是必要的? - ic90
1
get 方法对于不存在的键会返回 null。一般来说,使用 containsKey 更安全,因为映射可能具有 null 值,但在您的情况下,当您只是使用映射来保存计数器时,这是多余的。 - Mureinik

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