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

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 = 0operator 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 += 1result += 2result.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.rhkb.cn/news/464831.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RSTP的工作过程

RSTP简介: 生成树协议(STP)用于在网络中防止环路产生,但 STP 的收敛速度较慢。 RSTP(Rapid Spanning Tree Protocol )快速生成树协议:RSTP 是对 STP 的改进,它能在网络拓扑发生变化…

【IEEE出版 | EI稳定检索】2024智能机器人与自动控制国际学术会议 (IRAC 2024,11月29-12月1日)

2024智能机器人与自动控制国际学术会议 (IRAC 2024) 2024 International Conference on Intelligent Robotics and Automatic Control 官方信息 会议官网:www.icirac.org 2024 International Conference on Intelligent Robotics and Autom…

nginx 搭建网站

1.查看防火墙状态systemctl status firewalld 2.getenforce 3.安装nginx yum install nginx -y 4.网站信息 echo "welcome to yinchuankejixuanyuan" > /usr/share/nginx/html/index.html 5.查看命令状态 nginx -t 6.重启 systemctl restart nginx

从0开始搭建一个生产级SpringBoot2.0.X项目(八)SpringBoot 使用Redis

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot使用Redis 缓存数据 一、 pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>&…

Logstash 安装与部署(无坑版)

下载 版本对照关系&#xff1a;ElasticSearch 7.9.2 和 Logstash 7.9.2 &#xff1b; 官方下载地址 选择ElasticSearch版本一致的Logstash版本 https://www.elastic.co/cn/downloads/logstash 下载链接&#xff1a;https://artifacts.elastic.co/downloads/logstash/logst…

FBX福币交易所A股三大指数小幅低开 稀土永磁板块回调

查查配分析11月5日电 周二,A股三大指数小幅低开。沪指开盘跌0.10%报3306.81点,深证成指开盘跌0.09%报10653.20点,创业板指开盘跌0.05%报2184.90点。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 来源:同花顺iFinD 盘面…

基于python深度学习的交通标志图像识别设计与实现,卷积神经网络(CNN)作为主要架构

摘要 随着自动驾驶技术的发展&#xff0c;交通标志的识别与理解在智能交通系统中扮演着越来越重要的角色。本文设计并实现了一个基于深度学习的交通标志图像识别系统&#xff0c;通过对交通标志识别基准数据集的分析与处理&#xff0c;建立了一套完整的图像识别流程。使用Pyth…

js WebAPI黑马笔记(万字速通)

此笔记来自于黑马程序员&#xff0c;pink老师yyds 复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 注意&#xff1a; 这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, b…

跟李沐学AI:BERT

什么是NLP中的迁移学习 使用预训练好的模型来抽取词、句子的特征&#xff1a;Word2Vec或者预训练好的语言模型。 使用预训练好的语言模型&#xff0c;一般不会再对语言模型进行微调&#xff0c;即不进行更新。 Word2Vec一般用于替代embedding层 但是Word2Vec往往忽略了时序…

【ArcGIS】绘制各省碳排放分布的中国地图

首先&#xff0c;准备好各省、自治区、直辖市及特别行政区&#xff08;包括九段线&#xff09;的shp文件&#xff1a; 通过百度网盘分享的文件&#xff1a;GS&#xff08;2022&#xff09;1873 链接&#xff1a;https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

Unity照片墙效果

Unity照片墙效果&#xff0c;如下效果展示 。 工程源码

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

计算机网络:网络层 —— 路由信息协议 RIP

文章目录 路由选择协议动态路由协议路由信息协议 RIPRIP 的重要特点RIP的基本工作过程RIP的距离向量算法RIP存在的问题RIP版本和相关报文的封装 路由选择协议 因特网是全球最大的互联网&#xff0c;它所采取的路由选择协议具有以下三个主要特点&#xff1a; 自适应&#xff1a…

算法:图的相关算法

图的相关算法 1. 图的遍历算法1.1 深度优先搜索1.2 广度优先搜索 2. 最小生成树求解算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 3. 拓扑排序4. 最短路径算法 1. 图的遍历算法 图的遍历是指从某个顶点出发&#xff0c;沿着某条搜索路径对图中的所有顶点进行访问且只访问次的…

PowerCat反弹Shell

PowerCat介绍 PowerCat是一个powershell写的tcp/ip瑞士军刀&#xff0c;可以看成ncat的powershell的实现&#xff0c;然后里面也 加入了众多好用的功能&#xff0c;如文件上传&#xff0c;smb协议支持&#xff0c;中继模式&#xff0c;生成payload&#xff0c;端口扫描等等。 …

A014-基于Spring Boot的家电销售展示平台设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

蓬勃发展:移动开发——关于软件开发你需要知道些什么

一、前言 移动开发一直都是软件开发领域中最有趣的领域之一&#xff0c;这是因为&#xff1a; 1、移动开发为“只有一个人”的开发团队提供了一个非常独特的机会&#xff0c;让他可以在相对较短的时间内建立一个实际的、可用的、有意义的应用程序&#xff1b; 2、移动开发也代…

RK3568平台开发系列讲解(字符设备驱动篇)注册字符设备

🚀返回专栏总目录 文章目录 一、字符设备初始化二、字符设备的注册和注销沉淀、分享、成长,让自己和他人都能有所收获!😄 📢注册字符设备可以分为两个步骤: 字符设备初始化字符设备的添加一、字符设备初始化 字符设备初始化所用到的函数为 cdev_init(…),在对该函数讲…

软件测试面试题个人总结

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…

【Java语言】继承和多态(一)

继承 继承就是实现代码的复用&#xff1b;简而言之就是重复的代码作为父类&#xff08;基类或超类&#xff09;&#xff0c;而不同的可以作为子类&#xff08;派生类&#xff09;。如果子类想要继承父类的成员就一定需要extends进行修饰&#xff08;如&#xff1a;&#xff08;…