我有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
might be a good one as well。
答案 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 就是它的工作原理。