前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart字符串判空

Dart字符串判空

原创
作者头像
DSoon
修改2018-12-13 20:14:16
14.5K4
修改2018-12-13 20:14:16
举报
文章被收录于专栏:Flutter知识集Flutter知识集

NullPointerExp是无数java程序员都想消除的问题,OC里,nil对象调方法返回的是nil(这种做法,仁者见仁,智者见智);kotlin和swift通过optional机制,通过编程过程中强化Nullable概念,来避免NPE。

dart中,null是一个普通的Null类型对象,首先这点就让人有点困扰了。所以dart不会出现np,但是null调用其他方法会出现noSuchMethod的问题。这个体验就不是很好了。然后引入了null-aware操作符,这个和optional机制有点像,不过做的不彻底,且if的设定有点奇怪。

Dart是一门假装很现代,但实际上有点过时的语言。

先不吐槽了,回归标题吧。

Null-aware operators

dart语法中支持Null-aware操作符,?? ??=?.

用法
用法

Empty string judge

在判断一个字符串是否为空时,我们一般是这样写的:

代码语言:txt
复制
// 判断不为空
if (str != null && !str.isEmpty()) {
    // str is not empty, do something
}
// 判断为空
if (str == null || str.isEmpty()) {
    // str is empty, do something
}

在了解到null-aware操作符后,我们是不是可以这么写:

代码语言:txt
复制
if (!str?.isEmpty()) {
    // str is not empty, do something
}

if (str?.isEmpty()) {
    // str is empty, do something
}

其实不然,上面的代码是有问题的。具体问题有要从dart的if说起,dart的if判断来看。

Dart中规定,if中当且仅当参数为bool类型true时,为真,其他全部都为假。

知道这条规定,就可以发现上面的问题了:当str为空时str?.isEmpty()输出的结果为null,而这在if语句中,实际上相当于false,那么也就是说当str为空时,str?.isEmpty()进入了if的false分支。而相反的,在null前面加上!否定后,又变为了true,即当str为空时,!str?.isEmpty()反而是进入了true分支。

这明显是不符合我们期望的逻辑的,所以这种写法是绝对不可取的。

但是dart的string类型还有另一个方法isNotEmpty,此时这样写:

代码语言:txt
复制
if (str?.isNotEmpty()) {
    // str is not empty, do something
}

if (!str.isNotEmpty()) {
    // str is empty, do something
}

str非空时,逻辑肯定没有问题,当str为空时,str?.isNotEmpty会返回false,而同样的!str?.isNotEmpty,就会返回true,这样恰好就符合我们期望的逻辑了。

Conclusion

不过IDE是不建议if中传null这样非bool类型的对象的,所以你这样写的话会给一个提示:

这里的逻辑确实容易让不了解的人很困惑,所以不建议用以上null-aware操作符来做字符串的空判断。

如果想做一个工具方法来简化字符串的判断,也不用自己重复造轮子,推荐使用官方的quiver.strings这个库,里面涵盖了字符串的一些常用工具方法。

Wrote by Kevin(a2V2aW56aGFuMDQxN0BvdXRsb29rLmNvbQ==)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Null-aware operators
  • Empty string judge
  • Conclusion
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档