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,applyalso

takeIftakeUnless 不属于这个类别

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());
}

对,你没看错,这个东西我也想不懂为什么我不直接判空