Kotlin 初学者教程【Kotlin 专题 1】

简介: 关于 Kotlin 编程开源- Kotlin 编译器、Intellij IDEA 插件和构建工具都是开源的。可互操作- Kotlin 与 Java 100% 可互操作。这意味着您当前的所有 Java/Android 代码都可以与 Kotlin 无缝协作。简洁- 与 Java 相比,Kotlin 代码更加简洁。此外,Kotlin 代码更具表现力(更易于理解和编写)。工具友好- Kotlin 由 JetBrains 开发,该公司以创建开发工具而闻名。您可以选择任何 Java IDE 来编写 Koltin 代码。

关于 Kotlin 编程

  • 开源- Kotlin 编译器、Intellij IDEA 插件和构建工具都是开源的。
  • 可互操作- Kotlin 与 Java 100% 可互操作。这意味着您当前的所有 Java/Android 代码都可以与 Kotlin 无缝协作。
  • 简洁- 与 Java 相比,Kotlin 代码更加简洁。此外,Kotlin 代码更具表现力(更易于理解和编写)。
  • 工具友好- Kotlin 由 JetBrains 开发,该公司以创建开发工具而闻名。您可以选择任何 Java IDE 来编写 Koltin 代码。


为什么要学习 Kotlin?

  • Kotlin 可与 Java 100% 互操作。因此,您的 Java/Android 代码适用于 Kotlin。
  • Kotlin 允许您将代码行数减少大约 40%(与 Java 相比)。
  • 学习 Kotlin 很容易。如果您已经了解 Java,这将特别容易。
  • Kotlin 是工具友好的。您可以使用任何 Java IDE 或命令行来运行 Kotlin。


如何学习 Kotlin?

  • 关注“坚果前端”公众号
  • 官方 Kotlin 教程-来自官方网站的Kotlin 参考Kotlin 教程是学习 Kotlin 的最可靠来源。
  • 编写大量 Kotlin 代码- 学习编程的唯一方法是编写大量代码。

Kotlin 的历史

以下是 Kotlin 历史上的重要里程碑:

使用 Kotlin 的原因

以下是 Kotlin 被广泛使用的一些重要原因:

  • Kotlin 是一种静态类型语言,非常易于阅读和编写。
  • Kotlin 程序不需要在其程序中使用分号。这使得代码更容易且更具可读性。
  • 这种语言允许以各种方式交换和使用来自 Java 的信息。此外,Java 和 Kotlin 代码可以共存于同一个项目中。
  • Kotlin 的类型系统旨在从代码中消除 NullPointerException。
  • 在 Kotlin 中编写新代码将花费您更少的时间。部署 kotlin 代码并大规模维护它甚至更容易。

快速编译:

使用 Kotlin 时很容易编译代码,从而为 android 开发带来更好的性能,并且还将说明在整个代码中可以使用哪种类型的数据函数。

扩展功能:

Kotlin 可以支持多种扩展功能,而无需对代码进行任何更改。它有助于使现有代码对开发人员更具吸引力和宏伟。

例如:

Fun String.removeFirstLastChar():
String = this.substring(1, this.length -1)


此代码将有助于获取字符串的第一个和最后一个字符,我们可以将其应用为:

Val string1 = "Today is cloudy."
Val string2 = string1.removeFirstLastChar()


空安全:

在 Kotlin 中,系统区分空引用和非空引用,如下面的 Kotlin 示例所示。

例如,一个 String 变量不能为 null:

Var string1: String = "Today is Sunday"
String1 = null  // compilation error
To permit null, we can adjoin the nullable variable :
Var string2: String? = "Today is Sunday"
String2 = null
print(string2)

复制代码

互操作性:

Java 可以使用 Kotlin 代码,Kotlin 可以使用 Java 代码。所以,如果你有 OOPS 编程的知识,那么切换到 Kotlin 的开发是很容易的。另外,如果有一些用 Java 编写的应用程序,那么它们可以与 Kotlin 的环境一起使用。

强大的工具:

与 Java 一样,Kotlin 代码也可以使用 IDE 或使用命令行界面编写。使用 IDE 很容易,语法错误也大大减少。同时,当您使用命令行界面时,必须首先编译代码。

Smart Cast:

Smart casting 基本上有助于降低应用程序成本并提高其速度或性能。它致力于使用类型转换或不可变值来管理代码的效率。

例如,如果字符串被识别,那么它的长度和计数可以在 Smart Cast 函数的帮助下找到:

Val string1: Any = "Today is Monday"
when(string1)
{
is String  -> string1.length
Is Int -> string1.inc()
}


采用成本低:

Kotlin 之所以受到企业的青睐,是因为它降低了采用成本。最重要的是,它很容易被开发人员学习,尤其是具有编程背景。


Kotlin 的架构

构建良好的架构对于应用程序扩展其功能并满足最终用户群的期望非常重要。Kotlin 有自己独特的架构来分配内存并为开发人员和最终用户获得高质量的结果。

Kotlin 的协程和类以生成更少样板代码、增强性能和增强效率的方式构建核心。kotlin 编译器可以在多种情况下做出不同的反应,尤其是在指定各种语言时。



在架构图中,很明显代码执行是通过三个简单的步骤完成的。

  1. 第一步,将“.kt”或 kotlin 文件添加到编译器中。
  2. 第二步,Kotlin 编译器将代码转换成字节码。
  3. 第三步,将字节码放入 Java 虚拟机,由 JVM 执行。

当几个字节编码的文件在 JVM 上运行时,它们点燃了它们之间的相互通信,这就是为什么 Kotlin 中的特性称为 java ook 诞生的互操作性

当 Kotlin 以 JavaScript 为目标时,Kotlin 到 JavaScript 的转化就发生了。

在此类操作期间不考虑非 Kotlin 文件。同时针对 JavaScript 的 .kt 文件被 Kotlin 编译器转换为 ES5.1 以生成一致的 JavaScript 代码。Kotlin 编译器努力实现最佳大小的输出、与现有模块的互操作性、与标准库相同的功能以及 JavaScript 可读的输出。

通过分析可以看出 Kotlin 编译器可以创建更高效、更有能力和独立的代码,从而进一步产生高性能的软件产品。

Kotlin 变量

变量用于存储要在程序中操作和引用的数据。它从根本上是一个存储数据和标记它的单位,它等待一个说明性别名,以便程序易于阅读和理解。换句话说,我们可以说变量是收集信息的容器。

在 Kotlin 中,应该声明所有变量。但是,如果没有声明任何变量,则会弹出语法错误。此外,变量的声明决定了我们允许存储在变量中的数据类型。在 Kotlin 中,可以使用 val 和 var 关键字定义变量。这是在 Kotlin 中声明变量的语法:

瓦尔日=“星期一”
变量数 = 3Var day = "Monday
"Var number = 3

复制代码

在这里,我们声明了局部变量 day,其值为“Monday”,类型为 String 和另一个局部变量 number,其值为 3,类型为 Int,因为这里的文字是整数类型 3。

局部变量通常是同时声明和初始化的。我们还可以在初始化 Kotlin 变量时执行某些操作。

我们可以对相同数据类型的变量执行操作,因为这里的 num1 和 num2 都是相同的数据类型,即 Int,而 day 是字符串数据类型。因此,它会显示错误。这是如何在 Kotlin 中定义变量的另一种技术。

var day : String = "GURU99
"var num : Int = 100

复制代码

让我们看看 var 和 val 关键字。

变量:

Var 就像任何编程语言中使用的通用变量,可以在单个程序中多次使用。此外,您可以随时在程序中更改其值。因此,它被称为可变变量。

以下是 Kotlin 中可变变量的示例:

var num1 = 10
Var num2 = 20
Num1 = 20
print(num1 + num2) // output : 40

复制代码

这里 num1 的值 20 把 num1 刚开始的 10 覆盖。因此 num1 + num2 的输出是 40 而不是 30。

Val :

Val 就像一个常量变量,你不能在程序后面更改它的值,它既不能在单个程序中多次赋值,也不能在特定程序中使用一次。因此,它被称为不可变变量。

这是 Kotlin 中不可变变量的 Kotlin 程序示例:

Val num1 = 10
Var num2 = 20


这里,num1 的值 10 不能被 num1 的新值 20 覆盖,因为它是 val 类型的常量。因此,输出是 30 而不是 40。

注意:在 Kotlin 中,不可变变量优于可变变量。

Kotlin 中的数据类型

数据类型是一组相关的值,并描述了可以对它们进行操作的操作。与其他编程语言类似,Kotlin 也有其预定义的数据类型集,如 Int、Boolean、Char、Double 等。

在 Kotlin 中,每种数据类型都被视为一个对象。

现在在这个 Kotlin 基础教程中,让我们更深入地了解 Kotlin 中使用的预定义数据类型。

数字:

Kotlin 提供一组称为数字的内置数据类型,它们被细分为整数和浮点数。

整数:

整数是具有四种类型的数字类别:

浮点数 :

浮点数是带有一些十进制值的非整数。

Float:Float 是一个 32 位单精度浮点值。

示例:var: Float x = 3.25600

Double:Double 是 64 位双精度浮点值。

示例:var: Double y = 2456.345587

布尔值:

Kotlin 中的布尔数据类型对于表示逻辑值很重要。Boolean 中只有两个可能的值为真或假。

例如: val day = true

Val day2 = false

特点 :

Kotlin 中的字符借助称为 char 的关键字表示。在 Kotlin 中,单引号代表 char 的声明。在 java 中,char 有时被用作 kotlin 中不可能的数字。

例如:

val onechar = 'x'
print(onechar) //  output : x
Val onedigit = '7'
print(onedigit) // output : 7


Kotlin 类型转换或 Kotlin 类型转换

类型转换是将一种类型的数据变量转换为另一种数据类型变量的过程。

不一样的是在 Java 中,支持隐式类型转换或隐式类型将较小的数据类型转换为较大的数据类型。

For Example : int abc = 15;
Long bcd = abc; // compiles successfully


但是,在 kotlin 中,根本不支持将较小的数据类型隐式转换为较大的数据类型,即 int 数据类型不能隐式转换为 long 数据类型。

For Example : var abc = 15
Val bcd : Long = abc // error


但是,在 Kotlin 中,类型转换是显式完成的。下面是帮助函数的指南,用于指导将一种数据类型变量转换为另一种数据类型。

有一些辅助函数是预先拥有的,用于将一种数据类型转换为另一种:

toInt()

toByte()

toShort()

toChar()

toLong()

toFloat()

toDouble()

For Example : var abc = 15
Val bcd : Long = abc.toLong() // compiles successfully successfully


Kotlin 运算符

运算符是重要的特殊字符或符号,可确保在具有变量和值的操作数中进行操作。在 Kotlin 中,有一组运算符用于不同的运算,例如算术运算、赋值运算、比较运算等。

算术运算符:

算术运算符用于加、减、乘、除和取模。

例如:

无功 x = 10
变量 y = 20
var z = ( ( x + y ) * ( x + y ) ) / 2     


这里下面代码的输出是 45。

比较运算符:

比较运算符用于比较两个值、两个变量或两个数字。它与大于号( > )、小于号( < ) 和等于号( ==) 、不等于号( != )、大于等于号( >= )、小于等于号一起使用符号(<=)。它总是导致真或假。

例如:

var x = 10
var y = 20
var z = ( ( x + y ) * ( x + y ) ) / 2     


赋值运算符:

赋值运算符用于分配算术运算值。它与 +=、-=、*=、/=、%= 等符号一起使用。

例如:

var x = 10
Var y =20
Var z = x < y // Output : true
Var w = x > y // Output : false
Var m = x == y // Output : false


递增和递减运算符:

递增和递减运算符用于递增和递减变量或数字的值。它在 ++ 和 — 等符号的帮助下使用。

有两种类型的自增和自减,即前自增++a、后自增 a++、前自减-b、后自减 b-。

例如:

var a = 10
var b = 20
var c = a++ // Output: 11
var d = b— //Output : 19     


Kotlin 数组

数组是一组同构的数据类型,是最基本的数据类型之一,用于在连续的内存位置存储相同类型的数据。数组对于任何编程语言中的数据组织都很重要,因此存储在一个地方的多个数据很容易搜索或排序。

在 Kotlin 中,数组是相同数据类型的可变协作,而不是本机数据类型。

以下是 Kotlin 中数组的某些属性

  • 数组的大小一旦声明就不能更改。
  • Kotlin 中的数组是可变的。
  • 数组存储在连续的内存位置。
  • 可以借助 a[1]、a[2] 等索引来访问数组。
  • 数组的索引从零开始,即 a[0]。

在 Kotlin 中,可以用两种不同的方法定义数组

通过使用 arrayOf() 函数:

在 Kotlin 中,库函数有一个主要用途。一个这样的库函数是 arrayOf() 函数,它用于通过将变量的值传递给函数来定义数组。

例如:使用 arrayOf() 函数隐式类型声明数组

val x = arrayOf(1,2,3,4,5,6,7,8,9)

复制代码

例如:使用 arrayOf() 函数显式类型声明数组。

Val y = arrayOf<Int>(1,2,3,4,5,6,7,8,9)

复制代码

通过使用数组构造函数:

在 Kotlin 中,有一个名为 Array 的类。因此,使用构造函数的数组来创建数组是可行的。构造函数中的数组包含两个主要参数。

Kotlin 中数组的索引是什么?

数组索引可接受返回索引初始值的函数。

例如:

val abc = Array(7 , { i -> i*1})


这里,array 的值为 7,并且使用 lambda 表达式来初始化元素的值。

还有各种方法可以使用某些函数访问和修改数组。因此,有两个成员函数 get() 和 set() 用于访问类数组的对象。

例如:

val x = arrayOf(10,20,30,40,50,60,70,80,90)
val y = x.get(0) // Output 10


此处,输出为 10,因为数组索引 0 处的值为 10

注意:get() 只接受单个值

例如:

val x = arrayOf(10,20,30,40,50,60,70.80.90)
val y = x.set(2, 3) //

复制代码

输出:30 40

此处,输出为 30 和 40,因为数组索引 2 处的值是 30,而索引 3 处的值为 40。

注意:set() 接受一个数组的多个值。

Kotlin 字符串

字符串是任何编程语言中的基本数据类型。一个字符串只不过是一个字符序列。String 类表示字符串。在 Kotlin 中,所有字符串都是 String 类的对象,这意味着字符串文字被实现为该类的实例。

句法:

Val myString = "坚果!"

复制代码

Kotlin 集合

一个集合包含多个相似类型的对象,集合中的这些对象称为元素或项。集合可以帮助存储、检索、操作和聚合数据。

收藏类型:

不可变集合

这种类型的集合支持只读功能。不能修改其元素。

方法包括:

  • List – listOf() and listOf<T>()
  • Set – setOf()
  • Map – mapOf()

可变集合

它支持读和写功能。

方法包括

  • List – mutableListOf(),arrayListOf() and ArrayList
  • Set – mutableSetOf(), hashSetOf()
  • Map – mutableMapOf(), hashMapOf() and HashMap

Kotlin 函数

任何编程语言中的函数都是一组类似的语句,用于执行特定的任务。函数允许程序将其分解为各种小代码块。这种代码划分增加了代码的可读性、代码的可重用性,并使程序易于管理。

因为 Kotlin 被称为静态类型语言。在这里,'fun' 关键字用于声明一个函数。在 Kotlin 中,有两种类型的函数完全取决于它在标准库或用户定义中的可用性。他们是:

  • 标准库函数
  • 用户自定义函数


image.png


Kotlin 函数


现在,让我们用 Kotlin 代码示例详细讨论它们。

标准库函数

它们是可以隐式定义并可供使用的内置库函数。

对于示例 2:

fun main(args: Array<String>){  
var number = 9  
var result = Math.sqrt(number.toDouble())  
print("$result")  
} 


输出:

3.0

sqrt() 是库中定义的函数,它返回数字的平方根。

print() 函数将消息打印到标准输出流。

用户自定义函数

顾名思义,这些函数通常由用户创建,可用于高级编程。

在这里,函数是使用 'fun' 关键字声明的。


fun functionName(){
//body of the code}

复制代码

在这里,我们调用函数来运行主体内部的代码 functionName()

Kotlin 函数示例:

fun main(args: Array<String>){  
    sum()  
    print("code after sum")  
}  
fun sum(){  
    var num1 =8  
    var num2 = 9  
    println("sum = "+(num1+num2))  
} 


输出:

总和 = 17

求和后的代码

Kotlin 中的异常处理

编程中的异常被定义为程序中发生的运行时问题,导致程序终止。出现此问题的原因可能是内存空间较少、数组未绑定、被零除等条件。为了在代码执行中遏制这些类型的问题,使用了异常处理。

异常处理被定义为处理运行时问题并在执行期间维护程序流的技术。

Kotlin 使用“throw”表达式来抛出异常对象。这里所有的异常类都是 Throwable 类的后代。

抛出 MyException(“抛出异常”)

异常处理中有四种异常类型。他们是:

  • try – 该块包含可能会产生异常的语句。后面总是跟着 catch 或 finally 或两者。
  • catch - 它捕获从 try 块抛出的异常。
  • finally——它总是检查异常是否被处理。
  • throw – 用于显式抛出异常。

Try catch:

在异常处理的 try-catch 块中,try 块包围着可能抛出异常的代码,catch 块捕获表达式并进行处理。

try catch 块的语法:

try{    
//code with exception    
}catch(e: SomeException){  
//code handling exception  
}    


try 与 finally 块的语法

try{    
//code with exception    
}finally{  
// code finally block  
}   

最后:

在 Kolin 中,finally 块总是检查异常是否被处理,使其成为异常处理的一个非常重要的语句。

在此代码片段中,发生了异常并对其进行了处理。

fun main (args: Array<String>){  
    try {   
        val data =  9/ 0  
        println(data)  
    } catch (e: ArithmeticException) {  
        println(e)  
    } finally {  
        println("finally block executes")  
    }  
    println("write next code")  
}  


输出:

java.lang.ArithmeticException: / by zero
finally block executes
write next code


Throw:

Throw:块抛出一个显式异常。此外,它用于抛出自定义异常。

句法:

Throw SomeException()
Throw SomeException()


例子:

fun main(args: Array<String>) {
    try{
        println("Exception is not thrown yet")
        throw Exception("Everything is not well")
        println("Exception is thrown")
    }
    catch(e: Exception){
        println(e)
    }
    finally{
        println("You can't ignore me")
    }
}


输出:


image.png


Kotlin 空安全

支持 Kotlin 的系统类型主要区分可以携带可空引用的引用和不能携带可空引用的引用。Kotlin 是一种空安全语言,旨在消除代码中的空指针异常或空引用,这被故意称为十亿美元的错误。

许多编程语言最常见的绊脚石是,在访问空引用的成员时,结果是 NullPointerException,这可能是因为 !! 运算符或此构造函数在其他地方使用并在另一个代码点传递。可空属性每次在使用之前都需要对空检查进行确认。

在 Kotlin 中,系统区分空引用和非空引用。

例如,一个 String 变量不能为 null:

fun main(args: Array<String>){
    var x: String = "GURU99 is the only place where you will get maximum technical content!" // Not Null by default
    println("x is : $x")
    // You cannot assign null variable to not-nullable variables 
    // a=null // it will give compilation error
    var y: String? = "Thanks for visiting GURU99" 
// Nullable Variable
    println("y is : $y")
    y = null
    println("y is : $y")
}


输出:

image.png


Kotlin OOP

面向对象的编程方法允许通过创建对象将复杂的代码片段分成更小的代码块。这些对象相互共享两个特征:状态和行为。

以下是我们将在 Kotlin 代码示例中讨论的一些 OOP 元素:

  • 类和对象
  • 构造函数
  • Inheritance
  • 抽象类


image.png


Kotlin 中的类

首先在创建对象之前,我们需要定义一个类,也称为对象的 blueprint 。

句法:

class ClassName {
    // property
    // member function
    ... .. ...
}


Kotlin 中的对象

在定义类时,我们只定义对象的规格,没有分配其他参数,如内存或存储。

句法:

var obj1 = ClassName()


Kotlin 中的构造函数

构造函数是一种初始化类属性的方法。它是在实例化对象时调用的成员函数。但在 Kotlin 中,它的工作方式有所不同。

Kotlin 中有两种类型的构造函数:


image.png


Kotlin 中的构造函数

主构造函数:初始化类的优化方法

句法:

class myClass(valname: String,varid: Int) {  
    // class body  
}  


二级构造函数:有助于添加初始化逻辑

Kotlin 继承

当父类的某些属性被子类获取时,就会发生继承。当两个或多个类具有相同的属性时,允许继承。

open class ParentClass(primary_construct){
    // common code
  }class ChildClass(primary_construct): ParentClass(primary_construct_initializ){
    // ChildClass specific behaviours
  }


Kotlin 中的抽象类

抽象类是不能被实例化的类,但是我们可以从它们继承子类。'abstract '关键字用于声明一个抽象类。


  open class humanbeings { 
    open fun Eat() { 
        println("All Human being Eat") 
    } 
} 
abstract class Animal : humanbeings() { 
    override abstract fun Eat() 
} 
class Cat: Animal(){ 
    override fun Eat() { 
        println("Cats also loves eating") 
    } 
} 
fun main(args: Array<String>){ 
    val lt = humanbeings() 
    lt.Eat() 
    val d = Cat() 
    d.Eat() 
} 


输出:

image.png

Kotlin 的现在和未来

当下:

  • Netflix、Pinterest 和 Corda 等许多公司都在使用 Kotlin 来创建强大的 Android 应用程序。
  • 在短短的一年时间里,2016 年到 2017 年,Kotlin 凭借惊人的编程功能变得非常流行。
  • 2017 年,谷歌宣布 Kotlin 成为安卓开发的官方编程语言。
  • 您可以使用 Kotlin 快速替换 Java 代码,因为它与 Java 和 Android 100% 可互操作。

未来:

  • 跨平台游戏开发
  • 跨平台移动应用开发
  • 服务端脚本和微服务
  • 机器学习和数据分析

概括:

  • Kotlin 是 JetBrains 于 2010 年在 Apache 2.0 许可下为多平台应用程序提出的一种编程语言。
  • Kotlin 这个名字来源于 Kotlin Island 的名字,在 Java 的一个类似的对应关系中以一个叫做 java 的岛屿的名字命名。
  • 2016 年 Kotlin 第一版 v1.0 发布
  • Kotlin 程序不需要在其程序中使用分号。这使得代码更容易且更具可读性。
  • 面向 Android 开发人员的 Kotlin 是一种基于 OOP 的编程语言,其中代码行最多可减少 40%,这使 Kotlin 成为软件或 Web 开发的理想选择。
  • 在 Kotlin 中,所有变量都应该使用 var 和 val 关键字声明。
  • 与其他编程语言类似,Kotlin 也有其预定义的数据类型集,如 Int、Boolean、Char、Double 等。
  • 在 Kotlin 中,有一组运算符用于不同的运算,例如算术运算、赋值运算、比较运算等。
  • 在 Kotlin 中,数组是相同数据类型的可变协作,而不是本机数据类型。
  • 在 Kotlin 中,数组是使用两种方法定义的——ArrayOF() 和构造函数。
  • Kotlin 是一种空安全语言,它有助于从代码中去除空指针异常或空引用,这被故意称为十亿美元错误。


程序员们加油吧,马上年底了。

相关文章
|
5天前
|
前端开发 测试技术 数据处理
Kotlin教程笔记 - MVP与MVVM架构设计的对比
Kotlin教程笔记 - MVP与MVVM架构设计的对比
22 4
|
5天前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
17 3
|
5天前
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
16 2
|
1天前
|
算法 Kotlin
Kotlin教程笔记(24) -尾递归优化
Kotlin教程笔记(24) -尾递归优化
Kotlin教程笔记(24) -尾递归优化
|
3天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
|
1天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
9 2
|
1天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
|
5天前
|
Kotlin
Kotlin教程笔记(10) - 参数与异常
Kotlin教程笔记(10) - 参数与异常
|
6天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
|
13天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
下一篇
无影云桌面