3. swift & kotlin 的 Optional
swift
swift 中的 Optional 定义是这样的
let str : String? = nil
拆开就是这样拆开
print(str!)
同时语言级别提供几个语法糖,比如可以这样
if let myStr = str {
// 这里就不用解开了,相当于 let 给你解开了
print(myStr.count)
}
实际上的实现呢是通过系统官方的一个 Optional
类来实现的,加上 ?
号只是方便定义而已,比如一开始的代码也可以这样写
let str : Optional<String> = "112"
有没有发现这个和 Java 的 Optional 巨相识
后面的操作其实也就是隐式调用这个类的方法而已,不展开了,具体自己看源码。
kotlin
回到 kotlin
这里,kotlin 其实也有类似的定义,也不能说类似,几乎差不多,但是更强大
定义:
val str: String? = "11"
if (str != null){
// 注意这里是不需要像swift那么麻烦的,需要赋值,这里kt会自动推断,不需要自己拆包
print(str.lenght)
}
拆包:
// 嗯,kt 的拆包是两个叹号,比 swift 多一个
println(str!!.length)
高级组合拳:
kotlin 可以使用各种作用域函数进行快速的操作,这点比 swift 要强很多
根据 kotlin 的源码实现,其实 swift 其实也是可以实现这样的方法的,但是官方就是没有,我觉得很诡异
// 通过这个方式,就能直接把一个可选的值变成非空的it,然后进行操作,这边要比 swfit 强
str?.let{ println(it) }
而且这样的快速操作方法,kotlin 有五个,分别是 let
,run
,with
,apply
和 also
。
takeIf
和takeUnless
不属于这个类别
typescript
作为前端的希望,不好意思,它没有这个东西😀
Java 怎么实现?
其实 Java 的实现很简单,就是 Swift 的直白版本
定义:
Optional<String> str = Optional.of("1212")
判断:
str.ifPresent(s -> {
// 不为空就调用
});
这个地方 Java8 是不会创建一个闭包的,因为这是 java 8 的 api,以下的版本只能这样
if (str.isPresent()) {
System.out.println(str.get());
}
对,你没看错,这个东西我也想不懂为什么我不直接判空