具有地图的空感知运算符

时间:2018-07-02 17:31:12

标签: dart

我有the same problem with lists,现在是Map

我想做什么

以下语法不是 Dart ,因为在中它不会编译

map?[key] ?? otherValue

如果我的map不是 Map 而是 List ,则看起来像Günter pointed out here

list?.elementAt(index) ?? otherValue

我要搜索的内容

我知道map?[key]是无效的语法,因此我正在搜索类似elementAt的名称,该名称适用于列表和地图。

map?.valueFor(key) ?? otherValue

valueOf

显然还不存在。该问题具有解决方案和valueOf might be a good one as well

6 个答案:

答案 0 :(得分:2)

这有效:

(map ?? const {})[key] ?? otherValue;

因为key将访问Map ,它将始终返回null

答案 1 :(得分:1)

但我使用过几次其他语法:

map?.containsKey(key) ?? false ? map[key] : otherValue

尽管在功能上与@GünterZöchbauer提出的功能等效,但它有点麻烦。
无论如何,由于在某些情况下可能看起来更清晰,因此值得一提。

答案 2 :(得分:0)

map != null ? map[key]: otherValue;

它会在尝试访问变量之前检查地图是否为null,这与Günter的答案相同,但先进行检查。

答案 3 :(得分:0)

我将此功能用于null安全嵌套地图访问:

// Returns value of map[p1][p2]...[pn]
// where path = [p1, p2, ..., pn]
//
// example: mapGet(map, ["foo", 9, 'c'])
dynamic mapGet(Map map, List path) {
  assert(path.length > 0);
  var m = map ?? const {};
  for (int i = 0; i < path.length - 1; i++) {
      m = m[path[i]] ?? const {};
  }

  return m[path.last];
}

答案 4 :(得分:0)

像这样的东西可能可以作为扩展功能:

extension MapExtensions<T, K> on Map<T, K> {
  K getOrNull(T key) {
     if (this == null || !this.containsKey(key)) {
       return null;
     } else {
       return this[key];
     }
  }

  K getOrElse(T key, K fallback) {
    return this.getOrNull(key) ?? fallback;
  }
}

注意:我尚未对此进行测试,但应该可以。

答案 5 :(得分:0)

我根据上述答案编写了自己的版本。它主要用于 JSON 对象处理。

dynamic mapOrListGet(dynamic map, List path) {
    assert(path.length > 0);
    assert(map is List || map is Map);
    var m = map ?? const {};
    var firstEl = path.removeAt(0);
    var result = (m is List)
        ? (firstEl < m.length ? m.elementAt(firstEl) : null)
        : m[firstEl];
    if (path.length == 0 || result == null) {
      return result;
    } else {
      return mapOrListGet(result, path);
    }
  }

here 就是它的工作原理。