IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin 语言 -> 正文阅读

[移动开发]Kotlin 语言

Kotlin 不是 Swift on JVM

  • Swift 有 sum type, Kotlin 用 sealed class 来模拟, 但易用性真的不敢恭维, 写起来要加不少莫名其妙的字符.
// Kotlin
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
}

fun main() {
    println(eval(Sum(Const(1.0), Const(2.0)))) // --> 3.0
}

这是 Swift 的写法 :

// Swift
indirect enum Expr {
    case nan
    case const(Double)
    case sum(Expr, Expr)
}

func eval(_ expr: Expr) -> Double {
    switch (expr) {
    case .nan:
        return Double.nan
    case let .const(x):
        return x
    case let .sum(x, y):
        return eval(x) + eval(y)
    }
}

print(eval(.sum(.const(1.0), .const(2.0)))) // --> 3.0
  • Swift 有元组, Kotlin 没有.
// Kotlin
val (state, msg) = 404 to "not found."
val (state, msg) = Pair(404, "not found.")
println("error: $state ($msg)")

这是 Swift (以及所有正常语言) 的写法 :

// Swift
let (state, msg) = (404, "not found.")
print("error: \(state) (\(msg))")
  • Swift 有良好的数组 / 词典字面量
// Kotlin
val cube = arrayListOf(
    arrayListOf(1, 2, 3),
    arrayListOf(4, 5, 6),
    arrayListOf(7, 8, 9)
)

Swift 里是这样的

// Swift
let cube = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • Swift 能自定义运算符 (包括前缀, 中缀和后缀, 优先级), Kotlin 不知道是不是觉得这个东西复杂度太高, 只能允许中缀表示法.
// Kotlin
infix fun Double.sumOfSquare(rhs: Double): Double {
   return this * this + rhs * rhs
}

val x = 2.0 sumOfSquare 3.0

Swift 中是这样的

// Swift
infix operator *+*
func *+*(lhs: Double, rhs: Double) -> Double {
    return lhs * lhs + rhs * rhs
}

2.0 *+* 3.0
  • Swift 有 inout 参数, 可以直接改变函数的参数, 而 Kotlin (很多语言也) 没有
// Swift
infix operator <->

func <-><T>(lhs: inout T, rhs: inout T) {
    return swap(&lhs, &rhs)
}

var (a, b) = (1, 2)
a <-> b
print("a, b = \(a), \(b)") // a, b = 2, 1
  • Swift 中运算符可以直接作为高阶函数参数
// Kotlin
val sum = arrayListOf(1, 4, 5, 2, 3).reduce { x, y -> x + y } // 15

Swift 里可以直接用裸的 +

// Swift
let sum = [1, 4, 5, 2, 3].reduce(0, +) // 15

而 Kotlin 里那些语法特性, Swift 里当然有 :

  • 扩展方法 extension
extension Int {
    func times(_ fn: () -> Void) {
        (1...self).forEach { _ in fn() }
    }
}

3.times {
    print("Hi!")
}
  • 高阶函数, 语法和 Kotlin 十分类似.
(1...100).map { $0 * $0 }
         .filter { $0 % 2 == 1 }
  • 空安全和 Optional
let x: Int? = nil

x?.distance(to: 5) // nil
let y = x ?? 0 // 默认值

if let it = x { // if let
    // ...
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 需要更多教程,微信扫码即可

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?👆👆👆

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 别忘了扫码领资料哦【高清Java学习路线图】

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?和【全套学习视频及配套资料】
?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:28:54  更:2021-11-23 12:31:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:35:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码