Kotlin的入门(一)

kotlin的入门(一)

变量声明

val 用于值从不更改的变量。使用 val 声明的变量无法重新赋值。

var 用于值可以更改的变量

val languageName: String = "Kotlin"
var count: Int = 10
count = 15

类型推断

Kotlin 编译器可根据所赋值的类型来推断其类型

由于 "Kotlin" 的值为 String 类型,因此编译器推断 languageName 也为 String

Kotlin 是一种静态类型的语言。这意味着,类型将在编译时解析且从不改变

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()
// Fails to compile
languageName.inc()

inc() 是一个 Int 运算符函数,因此无法对 String 调用它

利用 Kotlin 的类型推断,既能确保代码简洁,又能确保类型安全

Null 安全

在某些语言中,可以声明引用类型变量而不明确提供初始值

这种情况下,变量通常包含 null 值.默认情况下,Kotlin 变量不能持有 null 值

// Fails to compile
val languageName: String = null

要使变量持有 null 值,它必须是可为 null 类型。可以在变量类型后面加上 ? 后缀,将变量指定为可为 null,如以下示例所示:

val languageName: String? = null

必须小心处理可为 null 的变量,否则可能会出现NullPointerException

条件语句

  1. if else 或 if else if

与Java类似

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

条件表达式:

  • 赋值
val answerString : String = if (count == 42){
    "I have the answer."
}else {
    "The answer eludes me."
}
println(answerString)
  • when
val answer = when{
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}
println(answer)

when 表达式 每个分支都由条件,"->"和结果来表示。如果箭头左侧的条件求值为 true,则会返回右侧的表达式结果,when 表达式示例中的代码在功能上与上一个示例中的代码等效,但可能更易懂

函数

要声明函数,请使用 fun 关键字,后跟函数名称。接下来,定义函数接受的输入类型(如果有),并声明它返回的输出类型。函数的主体用于定义在调用函数时调用的表达式

    fun generateAnswerString(countThreshold: Int): String {
        val answerString = if (count > countThreshold){
            "I have the answer."
        }else{
            "The answer eludes me"
        }
       return  answerString
    }
   val ans = generateAnswerString(35)
   println(ans)
简化函数声明

函数返回单个表达式的结果时,可以通过直接返回函数中包含的 if-else 表达式的结果来跳过声明局部变量,如以下示例所示

fun generateAnswerString(countThreshold: Int): String {
    return if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
}

还可以将 return 关键字替换为赋值运算符:

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
 }
匿名函数

并非每个函数都需要一个名称。某些函数通过输入和输出更直接地进行标识。这些函数称为“匿名函数”。您可以保留对某个匿名函数的引用,以便日后使用此引用来调用该匿名函数。

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

在上面的示例中,stringLengthFunc 包含对一个匿名函数的引用,该函数将 String 当作输入,并将输入 String 的长度作为 Int 类型的输出返回。因此,该函数的类型表示为 (String) -> Int。不过,此代码不会调用该函数。要检索该函数的结果,您必须像调用命名函数一样调用该函数。调用 stringLengthFunc 时,必须提供 String

高阶函数

一个函数可以将另一个函数当作参数。将其他函数用作参数的函数称为“高阶函数”。此模式对组件之间的通信(其方式与在 Java 中使用回调接口相同)很有用

private fun stringMapper(str:String, mapper: (String)-> Int):Int{
    return  mapper(str)
}

要调用 stringMapper(),可以传递一个 String 和一个满足其他输入参数的函数(即,一个将 String 当作输入并输出 Int 的函数)

val length = stringMapper("Android",{input ->input.length})
println(length)
val lengthT =  stringMapper("HelloWorld",stringLengthFunc)
println(lengthT)

如果匿名函数是在某个函数上定义的最后一个参数,则您可以在用于调用该函数的圆括号之外传递它,如以下示例所示

val length = stringMapper("Android") { input -> input.length }

使用 class 关键字来定义类

class Car
属性

类使用属性来表示状态。属性是类级变量,可以包含 getter、setter 和后备字段

class Wheel {
}
class Car {
    val wheels = listOf<Wheel>()
}

请注意,wheels 是一个 public val,这意味着,可以从 Car 类外部访问 wheels,并且不能为其重新赋值。如果要获取 Car 的实例,必须先调用其构造函数。这样,您便可以访问它的任何可访问属性

val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car

可以定义一个自定义构造函数,用来指定如何初始化类属性:

class Car(val wheels:List<Wheel>)
类函数和封装

类使用函数对行为建模。函数可以修改状态,从而帮助您只公开希望公开的数据。这种访问控制机制属于一个面向对象的更大概念,称为“封装”。

doorLock 属性对 Car 类外部的一切都不公开。要解锁汽车,必须调用 unlockDoor() 函数并传入有效的“钥匙”,如以下示例所示:

class Car(val wheels: List<Wheel>) {
    private val doorLock: DoorLock = ...

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

如果希望公开属性的 getter 而限制访问其 setter,则可以将该 setter 指定为 private

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    var gallonsOfFuelInTank: Int = 15
        private set

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

 val  car = Car(listOf<Wheel>());
// Fails to compile
 car.gallonsOfFuelInTank = 1

通过结合使用属性和函数,可以创建能够对所有类型的对象建模的类

互操作性

Kotlin 最重要的功能之一就是它与 Java 之间流畅的互操作性。由于 Kotlin 代码可编译为 JVM 字节码,因此 Kotlin 代码可直接调用 Java 代码,反之亦然。这意味着,您可以直接从 Kotlin 利用现有的 Java 库。此外,绝大多数 Android API 都是用 Java 编写的,因此可以直接从 Kotlin 调用它们。

Kotlin for Java developers

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页