Dart 带映射的空感知运算符
我有过,现在是了 我想做什么 以下语法不是Dart,因为它不编译: 如果我的Dart 带映射的空感知运算符,dart,Dart,我有过,现在是了 我想做什么 以下语法不是Dart,因为它不编译: 如果我的地图不是地图,而是列表,它看起来会像: 我在寻找什么 我知道map?[key]不是有效的语法,因此我正在搜索类似的东西,它适用于列表和映射 map?.valueFor(key) ?? otherValue 价值 这显然还不存在。该问题有解决方案和解决方案。这可以: (map ?? const {})[key] ?? otherValue; 因为键将回退到访问空的映射,该映射将始终返回null或 map != null
地图
不是地图
,而是列表
,它看起来会像:
我在寻找什么
我知道map?[key]
不是有效的语法,因此我正在搜索类似的东西,它适用于列表和映射
map?.valueFor(key) ?? otherValue
价值
这显然还不存在。该问题有解决方案和解决方案。这可以:
(map ?? const {})[key] ?? otherValue;
因为键
将回退到访问空的映射
,该映射将始终返回null
或
map != null ? map[key]: otherValue;
在尝试访问变量之前检查映射是否为null,这与Günter的答案相同,但首先检查。我使用此函数进行空安全嵌套映射访问:
// 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];
}
//返回map[p1][p2]…[pn]的值
//其中路径=[p1,p2,…,pn]
//
//示例:mapGet(map,[“foo”,9,'c'])
动态映射获取(映射、列表路径){
断言(path.length>0);
var m=映射??常数{};
for(int i=0;i
类似的功能可以用作扩展功能:
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;
}
}
扩展地图地图地图上的扩展{
K getOrNull(T键){
if(this==null | |!this.containsKey(key)){
返回null;
}否则{
返回此[键];
}
}
K getOrElse(T键,K回退){
返回此.getOrNull(键)??回退;
}
}
注意:我还没有测试过这个,但应该可以使用。我使用过几次的另一种语法:
map?.containsKey(key) ?? false ? map[key] : otherValue
尽管在功能上与@Günter Zöchbauer提出的方案相当,但它有点麻烦。无论如何,由于它在某些情况下看起来更清晰,因此值得一提。我根据上述答案编写了自己的版本。它主要用于JSON对象处理
DynamicMaporListGet(动态地图,列表路径){
断言(path.length>0);
断言(map是List | | map是map);
var m=映射??常数{};
var firstEl=path.removeAt(0);
变量结果=(m是列表)
?(第一个元素
这就是它的工作原理。这确实有效,而且看起来很漂亮。我想知道我怎么没有想到这一点,我是否应该为此创建一个问题。你是说
map?[key]
的问题。我认为这不太可能被添加<代码>?仅受
支持。请求为list?[index]
提供支持,但据我记忆所及,拒绝了。对于map.valueOf(key)
之类的内容,我明白了。可以尝试使用.<代码> const {}{代码>,以避免每次创建新的映射,至少在类型允许的情况下。您应该使用<代码> T MMAGET(MAP,列表路径){而不仅仅是dynamic
。当然,您可以使用不同程度的丑陋代码,但满意的答案必须等待Dart的未来版本:
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;
}
}
map?.containsKey(key) ?? false ? map[key] : otherValue