我有以下形式的作业和null检查以避免在我的地图中进行双重查找 在Dart中有更好或更惯用的方法吗?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
答案 0 :(得分:53)
从Dart 1.12开始,null-aware运算符可用于此类情况:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
如果左侧为空,则?.
运算符短路为空,如果它不为空,则??
运算符返回左侧,右侧为{否则。
声明
outgoing[a]?.contains(b)
因此,如果null
为outgoing[a]
,将评估为null
,如果不是contains(b)
,则评估为bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
。
这意味着结果语句将是以下之一:
inConn
这同样适用于inConn
布尔值,这意味着outConn
和||
都保证为非空,允许我们返回{{1}}的结果两个。
答案 1 :(得分:11)
现在有 4 个空值运算符
return subject ?? "defaultIfNull";
这类似于??但是将主题变量设置为默认值(如果为null)。
subject ??= "defaultIfNull";
object?.x
将在对象为null时返回null,object.x
将在对象为null时引发异常
以下结果
[
...[1, 2],
null,
]
是[1, 2, null]
为避免使用空值,请使用...?
var resultingList = [
...[1, 2],
...?subjectList,
];
答案 2 :(得分:9)
发布以下内容,因为我最终搜索了标题。
根据https://github.com/dart-lang/sdk/issues/66,似乎答案为“什么是Dart null检查成语或最佳实践?”是:
在一般情况下,没有空检查习惯用法或最佳做法。如果null-aware运算符不适合您的情况,请使用if (object == null)
或if (object != null)
中的直接比较。
答案 3 :(得分:0)
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;