【问题标题】:Alternative to getOrDefault for devices below API 24 Android对于低于 API 24 Android 的设备,可替代 getOrDefault
【发布时间】:2017-05-03 21:03:24
【问题描述】:

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

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

我收到警告 Call requires API level 24(current min is 16) on the method:

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

此方法是否有任何解决方法,使其可以在 SDK 版本低于 24 的手机上运行,​​例如 Marshmallow(23) 和 Lollipop(21)?

【问题讨论】:

标签: java android dictionary


【解决方案1】:

Kotlin:只需使用 elvis 运算符:

  val value = map[key] ?: 0

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

【讨论】:

    【解决方案2】:

    我建议创建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;
        }
    }
    

    这种模式广泛用于Android support libraries,例如ContextCompat.getColor 就是很好的例子

    【讨论】:

      【解决方案3】:

      您始终可以自己实现相同的逻辑:

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

      【讨论】:

      • 谢谢,这很好用。只是一个问题,根据上面@Bubletan的建议,方法实现检查HashMap是否包含键,这在上面的sn-p代码中是否有必要,即结合检查值是否为null?
      • get 将为不存在的密钥返回 null。一般来说,使用containsKey 更安全,因为地图可能有null 值,但在你的情况下,当你只使用地图来保存计数器时,它是多余的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多