专栏首页Flutter知识集Dart字符串判空
原创

Dart字符串判空

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

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

// 判断不为空
if (str != null && !str.isEmpty()) {
    // str is not empty, do something
}
// 判断为空
if (str == null || str.isEmpty()) {
    // str is empty, do something
}

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

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,此时这样写:

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==)

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android原生项目集成Flutter Module

    成功执行后,会在.android/Flutter/build/outputs/aar/目录下,创建一个flutter-debug.aar的包文件

    DSoon
  • Flutter实现雨滴动画

    写了几个Flutter的demo,但是对Flutter的自定义view和动画都不太了解,看到一个类似效果在android的实现,就尝试用Flutter做一下。同...

    DSoon
  • Flutter与Native通信 - PlatformChannel源码分析

    Flutter是一个跨平台的方案,在UI、触控及基本的网络请求上已经基本做到平台无关,但是在某些平台特性的功能上,还是必须要对不同的平台做处理。这就涉及到与Na...

    DSoon
  • R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)

    数据根据结构可以分为结构化数据、非结构化数据和半结构化数据,前面介绍的数据处理函数针对于结构化数据,而字符串通常包含非结构化或者半结构化数据,这一部分介绍一下...

    1480
  • PHP对Json字符串解码返回NULL的一般解决方案

    php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array;若为false,返回object。如果...

    用户7657330
  • 使用request.getInputStream() 获取POST数据

    qubianzhong
  • 【Codeforces】1230B - Ania and Minimizing

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    喜欢ctrl的cxk
  • Coderbyte-Challenger之Letter Capitalize(单词字母大写)

    Have the function LetterCapitalize(str) take the str parameter being passed and...

    chain
  • JS 将一段文本 每个英文首字母大写

    书童小二
  • PHP基础——字符串的常用操作

    在PHP中使用trim()函数去除字符串左右的空格和特殊字符,使用rtrim()函数去除字符串右侧的空格和特殊字符,使用ltrim()函数去除字符串左侧的空格和...

    zhaozhiyong

扫码关注云+社区

领取腾讯云代金券