002-Kotlin界面开发之Kotlin旋风之旅

news2024/11/26 0:57:15

Kotlin旋风之旅

在这里插入图片描述

Compose Desktop中哪些Kotlin知识是必须的?

在学习Compose Desktop中,以下Kotlin知识是必须的:

  • 基础语法:包括变量声明、数据类型、条件语句、循环等。
  • 面向对象编程:类与对象、继承、接口、抽象类等。
  • 函数式编程:高阶函数、Lambda表达式、内联函数等。
  • 协程:理解协程的基本概念、使用launch和async等构建并发程序。
  • Kotlin标准库:熟悉常用的集合操作、字符串处理、文件I/O等。
  • DSL(领域特定语言):Compose本身就是一个DSL,理解如何构建和使用DSL非常重要。
  • Kotlin扩展函数:如何为现有类添加新功能。
  • Kotlin特性:如空安全、数据类、解构声明等。
  • 掌握这些知识将有助于你更好地使用Compose Desktop进行开发。

基础语法

变量与类型

在Kotlin中,使用valvar关键字来声明变量。val声明的变量是只读的,一旦赋值就不能再修改;var声明的变量是可变的。

从下面的例子可以看到,1)变量类型后置;2)没有分号!

val name: String = "Alice"
val age: Int = 18
val isStudent: Boolean = true
var score: Double = 99.5

并且,Kotlin中的变量类型可以省略,编译器会根据赋值的类型自动推断变量的类型。

val name: String = "Alice"
val age: Int = 18
val isStudent: Boolean = true
var score: Double = 99.5

在Java的基础上,Kotlin引入了一些新的数据类型,如StringIntBoolean等。这些数据类型是不可变的,也就是说,一旦创建,就不能再修改。总的来说,Kotlin的基础数据类型某些时候比Java的更好用,提供了更多的功能。Kotlin的类与Java的类可以直接互操作,这是因为Kotlin是在Java虚拟机上运行的。

通过变量的javaClass属性,可以获取变量的Java类。

val name: String = "Alice"
println("name is a Java Class: ${name.javaClass}") // class java.lang.String

这里还可以看到,Kotlin的字符串是Java的String类,同时,Kotlin支持字符串模板,可以在字符串中插入变量。

对于变量和类型,Kotlin最甜的就是增加了扩展方法,这是Java中没有的特性。扩展方法可以为现有的类添加新的方法,而不需要继承这个类。这样,我们可以为Java的类添加新的方法,而不需要修改Java的源代码。

fun String.addHello(): String {
    return "Hello, $this"
}

val name: String = "Alice"
println(name.addHello()) // Hello, Alice

Kotlin标准库和基础类型中有很多这样的扩展方法,可以方便地操作字符串、集合等。同时,也可以定义扩展属性,因为属性本身就只是两个方法的语法糖(Java就没有~~~)。

扩展方法在Jetpack Compose中非常常见,非常常用。🙋‍♀️🌰,描述尺寸时,常常会使用一个单位Dp,那么调用的时候通常会有

val size: Dp = 16.dp

后面这个语法就特别奇怪,居然调用整数的dp属性,简直翻天了。在源程序中,我们可以看到:

@Stable
inline val Int.dp: Dp get() = Dp(value = this.toFloat())

这是一个只读的属性(只有get方法),返回的是一个Dp对象。这个Dp对象是一个数据类,包含一个value属性,表示尺寸的值。这样,我们就可以直接使用Intdp属性来创建一个Dp对象,而不需要调用Dp的构造函数。真是完美的语法糖。

控制语句

在Java的基础上,Kotlin引入了一些新的控制语句,如when表达式、if表达式等。这些新的控制语句使得代码更加简洁、易读。

when表达式是Kotlin中的一个强大的控制语句,可以替代Java中的switch语句。when表达式可以匹配任意类型的值,可以是常量、变量、表达式等。

val score = 90
val rank = when (score) {
    in 90..100 -> "优秀"
    in 80..89 -> "良好"
    in 70..79 -> "中等"
    in 60..69 -> "及格"
    else -> "不及格"
}

这里也看到,when是一个表达式,可以直接赋值给一个变量。

同样,if也是一个表达式,可以直接赋值给一个变量。

val score = 90
val result = if (score >= 60) "及格" else "不及格"

在循环方面,Kotlin也引入了一些新的语法,如for循环、while循环等。for循环可以遍历任何实现了Iterable接口的对象,如数组、集合等。

val names = listOf("Alice", "Bob", "Charlie")
for (name in names) {
    println(name)
}

这些都不重要,看到能够理解应该就够了。

面向对象编程

Kotlin首先是完全继承了Java的面向对象特性的,所以,Kotlin中的类、对象、接口、继承、多态等概念都和Java中的一样。但是,Kotlin中也引入了一些新的特性,如数据类、枚举类、对象类等。

数据类

数据类是Kotlin中的一个特殊类,用于存储数据。数据类会自动生成equals()hashCode()toString()等方法,使得数据类更加易于使用。

data class User(val name: String, val age: Int)

这里定义了一个数据类User,包含两个属性nameage。这样,我们就可以直接创建一个User对象,而不需要手动实现equals()hashCode()等方法。

val user1 = User("Alice", 18)
val user2 = User("Alice", 18)
println(user1 == user2) // true

能用则用,简直太香了。

枚举类

枚举类是Kotlin中的一个特殊类,用于表示一组常量。枚举类可以包含多个枚举常量,每个枚举常量都有一个名称和一个值。

enum class Color {
    RED, GREEN, BLUE
}

这里定义了一个枚举类Color,包含三个枚举常量REDGREENBLUE。这样,我们就可以直接使用枚举常量,而不需要手动定义常量。

val color = Color.RED

这个也比Java的香太多, 转换到数字,转换到字符串,都是一行代码的事情。

对象类

在Java中,单例有的时候是一个很重要的设计模式。Kotlin直接增加了一个object关键字,用于定义单例对象。

object Singleton {
    fun sayHello() {
        println("Hello, Singleton!")
    }
}

这里定义了一个单例对象Singleton,包含一个sayHello()方法。这样,我们就可以直接使用单例对象,而不需要手动实现单例模式。

Singleton.sayHello()

这个也是非常香的,不需要写那么多的代码,直接就是一个单例对象。

函数式编程

Java是一个面向对象的编程语言,而Kotlin是一个面向对象和函数式编程的编程语言。Kotlin中的函数是一等公民,可以作为参数、返回值、变量等使用。

高阶函数

高阶函数是Kotlin中的一个重要概念,指的是可以接受函数作为参数、返回函数的函数。高阶函数可以使代码更加简洁、易读。

fun add(a: Int, b: Int): Int {
    return a + b
}

fun subtract(a: Int, b: Int): Int {
    return a - b
}

fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

这里定义了两个函数add()subtract(),分别用于加法和减法。然后定义了一个高阶函数calculate(),用于计算两个数的和或差。

val sum = calculate(1, 2, ::add)
val difference = calculate(1, 2, ::subtract)

这里全局函数addsubtract都是函数类型(Int, Int) -> Int,所以可以直接传递给calculate函数。并且::是函数引用操作符,可以获取函数的引用。实际上,Kotlin利用了Java的静态类的静态方法的特性,将函数作为一个静态方法传递给了calculate函数。

Lambda表达式

对于上面那个例子,我们还可以用一些更加魔幻的调用方式:

val chaos = calculate(1, 2, { a, b -> a*b + a / b })

这里,{ a, b -> a*b + a / b }就是一个Lambda表达式,用于计算两个数的乘积加上商。Lambda表达式是一种匿名函数,可以作为参数传递给函数。Lambda表达式的语法是{ 参数列表 -> 函数体 },参数列表和函数体之间用->分隔。

进一步,Kotlin提供了一个极其变态的语法糖,上面的调用可以写成:

val chaos = calculate(1, 2) { a, b -> a*b + a / b }

这看起来就像是一个方法定义,但是实际上是一个方法调用。这个语法糖是Kotlin中的一个特性,使得代码更加简洁、易读(并不是~~~)

引用对象的函数

全局的方法,我们用::来引用,那么对于对象的方法,我们可以直接引用:

class Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
}

val calculator = Calculator()
val sum = calculator::add

这里,calculator::add就是引用calculator对象的add方法。这样,我们就可以直接使用sum变量来调用add方法。

val result = sum(1, 2)

运算符重载

这个是Kotlin的一个特性,可以为现有的类添加新的运算符。运算符重载可以使代码更加简洁、易读。

这里我们就介绍一个重载,就是把一个类伪装成一个函数。

data class Point(val x: Int, val y: Int) {
    operator fun invoke(): String {
        return "($x, $y)"
    }
}

这里定义了一个数据类Point,包含两个属性xy。然后重载了invoke运算符,使得Point类可以像函数一样调用。

val point = Point(1, 2)
println(point()) // (1, 2)

DSL之假装调用奇怪的东西

当我们把重载调用操作符和Lambda表达式结合起来,就可以创建一种奇怪的东西:

class Calculation {
    var result: Int = 0

    operator fun plusAssign(value: Int) {
        result += value
    }
}

class CalculationScope {
    operator fun invoke(block: Calculation.() -> Unit): Calculation {
        val calculation = Calculation()
        calculation.block()
        return calculation
    }
}

这里定义了一个Calculation类,包含一个result属性和一个plusAssign运算符重载。然后定义了一个CalculationScope类,包含一个invoke运算符重载。

这个方法调用的是Calculation的一个扩展函数,这个扩展函数是一个Lambda表达式,这个Lambda表达式的接收者是Calculation对象。这样,我们就可以使用CalculationScope类创建一个Calculation对象,并使用plusAssign运算符重载。

val cs = CalculationScope()
val calculation = cs() {
    result += 1
    result += 2
    result.plusAssign(3)
}

println(calculation.result) // 6

首先,我们创建了一个CalculationScope对象cs,然后使用cs对象创建了一个Calculation对象calculation

calculation的扩展函数(block)中,我们使用了plusAssign函数,直接操作了result。这简直是三观丧尽、斯文扫地……我们程序员都看不懂了。

这个玩意是Kotlin实现各种奇葩DSL的基础:

  • 扩展函数
  • 运算符重载
  • Lambda表达式
  • 接收者类型

Jetpack Compose的DSL

Jetpack Compose是一个基于Kotlin的DSL(领域特定语言),用于构建用户界面。DSL是一种专门用于某个领域的编程语言,用于简化特定领域的编程任务。

Jetpack Compose的DSL是基于函数式编程的,使用函数来构建用户界面。这种DSL的设计使得Jetpack Compose非常灵活、易用。

这里就详细介绍了,后面会在恰当的时候再介绍。

总结

其他需要掌握的知识,如协程、Kotlin标准库、Kotlin特性等,都是Kotlin的高级特性,对于Compose Desktop的开发这个学习阶段并不是必须的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】

文章目录 📕课程总结📕安装 Unity 编辑器与打包模块📕导入 OpenXR📕导入 XR Interaction Toolkit📕打包发布 获取完整课程以及答疑,工程文件下载: https://www.spatialxr.tech/ 视频试看链接&a…

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章,因为多节点配置还是比较麻烦的先要jdk、zookeeper,再ck,还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇(三)&#x…

RabbitMQ交换机类型

RabbitMQ交换机类型 1、RabbitMQ工作模型2、RabbitMQ交换机类型2.1、Fanout Exchange(扇形)2.1.1、介绍2.1.2、示例2.1.2.1、生产者2.1.2.2、消费者2.1.2.3、测试 2.2、Direct Exchange(直连)2.2.1、介绍2.2.2、示例2.2.2.1、生产…

MoonNet基准测试更新

基准测试 引言:为了展示MoonNet网络库支持的动态负载均衡功能,我进行了吞吐量测试,以突出其性能表现。由于该库的动态负载均衡策略包括动态线程调度,测试中的线程数变化是不稳定的。这种动态调整使得直接与其他库采用固定线程数的…

RHCE——笔记

nfs服务器 一、简介 NFS(网络文件系统) 允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的应用中,本地NFS的客户端应用可以透明地读…

2023年SCRM系统排名分析及市场趋势解读

内容概要 当前,SCRM(社交客户关系管理)系统在企业运营中的重要性日益凸显,尤其是在快速发展的数字经济环境中。2023年的SCRM市场展现出多元化与专业化的趋势,不同企业在客户关系管理方面的需求各有不同,这…

上云管理之Git/GitHub/GitLab 详解(一)

上云管理之Git/GitHub/GitLab 详解(一) 引言1. GIT软件安装2.初始化配置与提交代码2.1. 初始化配置2.2 本地仓库代码提交2.2.1 初始化仓库并提交代码2.2.2 再次提交已修改的代码2.2.3 文件夹层次结构代码提交 2.3 GIT 的文件状态 3.GIT 分支3.1. 分支的切换与删除3.…

10款录屏软件来助你视频回放!!

现在互联网的普及,实时在线视频交流已是家常便饭,有时我们需要进行视频回顾,这就需要借助录屏软件。不管是用于游戏录制、课程制作、教学培训还是项目汇报等, 一款好的录屏软件都能起到事半功倍的效果。今天,我就来跟大…

Python复习2

一、封装函数 #自己封装len函数 s1 "hello,python" print(f"s1的长度为{len(s1)}")def my_len(data):count0for i in data:count 1print(f"{data}的长度为{count}")my_len(s1) 二、容器的排序(排序之后的结果都会变成列表&#xf…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

基于java+SpringBoot+Vue的校园资料分享平台设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

VuePress文档初始化请求过多问题探讨

1. 背景 公司有部门使用VuePress 1.0搭建平台的帮助文档&#xff0c;前期文档不是很多&#xff0c;所以没有暴露出特别明显的问题。但随着文档的逐步迭代和内容的增多&#xff0c;出现了大量的并发请求&#xff0c;总共有218个请求&#xff0c;导致服务器带宽耗尽、响应速度下降…

入门 | Kafka数据使用vector消费到Loki中使用grafana展示

一、Loki的基本介绍 1、基本介绍 Loki 是由 Grafana Labs 开发的一款水平可扩展、高性价比的日志聚合系统。它的设计初衷是为了有效地处理和存储大量的日志数据&#xff0c;与 Grafana 生态系统紧密集成&#xff0c;方便用户在 Grafana 中对日志进行查询和可视化操作。 从架构…

C语言 运算符

时间&#xff1a;2024.11.4 一、学习内容 1、算数运算符&#xff08;加、减、乘、除法和取余&#xff09; 通用细节&#xff1a; 1.整数计算&#xff0c;结果一定是一个整数 2.小数计算&#xff0c;结果一定是一个小数 3.整数和小数计算&#xff0c;结果一定是一…

LLM | 论文精读 | AAAI | EarthVQA:向可查询地球迈进的多模态视觉问答研究

论文标题: EarthVQA: Towards Queryable Earth via Relational Reasoning-Based Remote Sensing Visual Question Answering 作者: Junjue Wang, Zhuo Zheng, Zihang Chen, Ailong Ma, Yanfei Zhong 期刊: The Thirty-Eighth AAAI Conference on Artificial Intelligence (AA…

总结拓展十五:SAP物料分割评估

一、概述 在SAP中&#xff0c;物料的分割评估是指&#xff0c;对同一个物料做不同的价值设置。即&#xff0c;根据不同的条件&#xff0c;核算其价格及记录价格的相关属性。 二、物料主数据设置 1、物料主数据-会计1视图 只有价格控制“V”可以分割评估。 2、设置评估类型…

ai翻唱部分步骤

模型部署 我是用的RVC进行的训练&#xff0c;也可以使用so-vits-svc。 通过百度网盘分享的文件&#xff1a;RVC-beta 链接&#xff1a;https://pan.baidu.com/s/1c99jR2fLChoqUFqf9gLUzg 提取码&#xff1a;4090 以Nvida显卡为例&#xff0c;分别下载“RVC1006Nvidia”和…

[综述笔记]Deep learning for brain disorder diagnosis based on fMRI images

论文网址&#xff1a;Deep learning for brain disorder diagnosis based on fMRI images - ScienceDirect 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向…

HarmonyOS:UIAbility组件概述

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility的设计理念&#xff1a; 原生支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility划分原则与建议&#xff1a; UIAbility组件是系统调度的基本单元&#xff0c…

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据&#xff1a;菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…