首页 > 其他分享 >Kotlin语言基础入门:Kotlin简介

Kotlin语言基础入门:Kotlin简介

时间:2023-10-31 15:33:02浏览次数:34  
标签:协程 入门 Int Kotlin 简介 println obj null

在2019年Google I/O大会上,Google 宣布今后将优先采用 Kotlin 进行 Android 开发。

一,简介

Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。

Google 列举的 Kotlin 的优势:

  • 富有表现力且简洁:可以使用更少的代码实现更多的功能。表达自己的想法,少编写样板代码。
  • 更安全的代码:Kotlin 有许多语言功能,可帮助你避免null指针异常等常见编程错误。
  • 可互操作:可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotlin 代码。Kotlin 可完全与 Java 编程语言互操作。
  • 结构化并发:Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理。

更重要的是,Jetpack Compose 仅支持 Kotlin,而不再支持 Java。 Google 提到多平台项目可使用 Kotlin 来开发。

二,概念介绍

1. 包的定义和使用

包的定义应该写在文件的顶部。

package com.rustfisher.ktpractice.intro

import kotlin.text.*

// ...

Kotlin并不要求包名和文件存放位置严格对应。

2. 程序入口

Kotlin应用的程序入口是main方法。

fun main() {
    // ..
}

另一个main方法带有参数

fun main(args: Array<String>) {
    // ...
}

3. 标准输出

print方法将传入的变量打印到标准输入流。

print("Rust ")
print("Fisher")

println打印传入变量并且在最后添加一个换行。

println("an.rustfisher.com")
println(42)

4. 方法

下面是一个接受2个Int参数,返回Int的方法。

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

方法主体可以是一个表达式。它的返回值可以被推断出来。

fun sum(a: Int, b: Int) = a + b

方法可以没有返回值,或者说是返回一个无意义的值(Unit)。

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}

Unit可以忽略不写。

fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}

5. 变量

只能读的变量需要用关键字val。它们只能被赋值1次。

val a: Int = 1 // 直接赋值
val b = 2      // 自动推测出是Int类型
val c: Int     // 当没有赋初始值时,需要声明类型Type required when no initializer is provided
c = 3          // 这里是推迟赋值

可以多次赋值的变量用关键字var

var x = 5 // 自动推测出是Int型
x += 1

可以在顶部声明变量

val PI = 3.14
var x = 0

fun incrementX() { 
    x += 1
}

6. 创建类与实例

定义一个类,使用class关键字

class Fisher

类的属性可以放在定义中或者类里。比如下面这个类Rectangle,描述长方形。

class Rectangle(var height: Double, var length: Double) {
    var perimeter = (height + length) * 2
}

默认构造器中的变量可以直接使用。这里可以直接使用面积变量perimeter

val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")

对于kotlin v.1.4.30,类的继承用冒号:来表示。类默认都是final的,不可继承。为了继承,用open让这个类能被继承。

open class Shape
class Rectangle(var height: Double, var length: Double): Shape {
    var perimeter = (height + length) * 2
}

7. 注释

和其他现代编程语言类似,用//或者/**/来注释

// 这里是注释 RustFisher
/**
 * 这是注释
 */
/* 这也是注释 */

8. 字符串模版(String tempplates)

直接使用变量,用$

要使用表达式,需要用大括号${}

var a = 1
// 简单使用$
val s1 = "a is $a" 

a = 2
// 使用方法
val s2 = "${s1.replace("is", "was")}, but now is $a"

9. 条件表达式

fun getMax(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

Kotlin中,if也可以写成一个表达式

fun getMax(a: Int, b: Int) = if (a > b) a else b

10. for循环

使用in

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}

使用下标

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}
for (i in 1..3) {
    println(i)
}
for (i in 6 downTo 0 step 2) {
    println(i)
}

11. while循环

val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

12. when表达式

when看起来有点像Java里的witch,但这两个是不同的东西。

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One" 
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

13. 范围

检查一个数字是否在范围中,使用in操作

val x = 10
val y = 9
if (x in 1..y+1) {
    println("在范围内")
}

检查一个数是否超出了范围

val list = listOf("a", "b", "c")

if (-1 !in 0..list.lastIndex) {
    println("-1 超出了范围")
}
if (list.size !in list.indices) {
    println("list的size也超出了下标范围")
}

遍历一个范围

for (x in 1..5) {
    print(x)
}

指定步进值

for (x in 1..10 step 2) {
    print(x)
}
println()
for (x in 9 downTo 0 step 3) {
    print(x)
}

14. 集合

遍历一个集合

for (item in items) {
    println(item)
}

检查集合中是否包含某个对象,用in操作

when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is fine too")
}

用lambda表达式对集合进行filter和map操作

val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }

15. 可为null的值和null检查

可以为null的变量,后面需要一个问号?

下面这个方法返回Int或者null

fun parseInt(str: String): Int? {
    // ...
}

使用可能返回null的方法(上面那个方法)

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // Using `x * y` yields error because they may hold nulls.
    if (x != null && y != null) {
        // x 和 y 经过null检测后自动变成了非null值
        println(x * y)
    }
    else {
        println("'$arg1' or '$arg2' 不是数字")
    }    
}

或者写做

// ...
if (x == null) {
    println("参数错误 arg1: '$arg1'")
    return
}
if (y == null) {
    println("参数错误 arg2: '$arg2'")
    return
}

// x 和 y 经过null检测后自动变成了非null值
println(x * y)

16. 类型检查和自动转换

is来检查某个对象是不是某个类型。 如果确定某个不可变的变量的类型,那后面使用它的时候不用再显式转换

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // obj已经自动转换为String类型
        return obj.length
    }

    // 这里的obj仍然是Any类型
    return null
}

或者用!is

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // 这里的obj已经自动转换为String类型
    return obj.length
}

再换个写法

fun getStringLength(obj: Any): Int? {
    // 这里面的obj已经自动转换为String类型
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

最后分享一份《史上最详Android版kotlin协程入门进阶实战》

目录

Kotlin语言基础入门:Kotlin简介_Kotlin

Kotlin语言基础入门:Kotlin简介_Kotlin_02

第一章 Kotlin协程的基础介绍

  • 1.1 协程是什么
  • 1.2 什么是Job 、Deferred 、协程作用域
  • 1.3 Kotlin协程的基础用法

Kotlin语言基础入门:Kotlin简介_赋值_03

第二章 kotlin协程的关键知识点初步讲解

  • 2.1 协程调度器
  • 2.2 协程上下文
  • 2.3 协程启动模式
  • 2.4 协程作用域
  • 2.5 挂起函数

Kotlin语言基础入门:Kotlin简介_赋值_04

第三章 kotlin协程的异常处理

Kotlin语言基础入门:Kotlin简介_Java_05

第四章 kotlin协程在Android中的基础应用

  • 4.1 Android使用kotlin协程
  • 4.2 在Activity与Framgent中使用协程
  • 4.3 ViewModel中使用协程
  • 4.4 其他环境下使用协程

Kotlin语言基础入门:Kotlin简介_赋值_06

第五章 kotlin协程的网络请求封装

  • 5.1 协程的常用环境
  • 5.2 协程在网络请求下的封装及使用
  • 5.3 高阶函数方式
  • 5.4 多状态函数返回值方式
  • 5.5 直接返回值的方式

第六章 深入kotlin协程原理(一)

  • 6.1 suspend 的花花肠子
  • 6.2 藏在身后的- Continuation
  • 6.3 村里的希望- SuspendLambda

Kotlin语言基础入门:Kotlin简介_赋值_07

第七章 深入kotlin协程原理(二)

  • 7.1 协程的那些小秘密
  • 7.2 协程的创建过程
  • 7.3 协程的挂起与恢复
  • 7.4 协程的执行与状态机

Kotlin语言基础入门:Kotlin简介_Kotlin_08

第八章 Kotlin Jetpack 实战

  • 8.1 从一个膜拜大神的 Demo 开始
  • 8.2 Kotlin 写 Gradle 脚本是一种什么体验?
  • 8.3 Kotlin 编程的三重境界
  • 8.4 Kotlin 高阶函数
  • 8.5 Kotlin 泛型
  • 8.6 Kotlin 扩展
  • 8.7 Kotlin 委托

Kotlin语言基础入门:Kotlin简介_赋值_09

第九章 Kotlin + 协程 + Retrofit + MVVM优雅的实现网络 请求

  • 9.1 项目配置
  • 9.2 实现思路
  • 9.3 协程实现
  • 9.4 协程 + ViewModel + LiveData实现
  • 9.5 后续优化
  • 9.6 异常处理
  • 9.7 更新Retrofit 2.6.0

Kotlin语言基础入门:Kotlin简介_Java_10

标签:协程,入门,Int,Kotlin,简介,println,obj,null
From: https://blog.51cto.com/u_16163452/8106441

相关文章

  • Kotlin: 高阶函数与Lambda表达式 (转)
    Kotlin:高阶函数与Lambda表达式(转)本文转自:https://rengwuxian.com/kotlin-lambda/看到一篇写得不错的关于kotlin高阶函数与Lambda的博文,特转载之。1.Kotlin的高阶函数Kotlin很方便,但有时候也让人头疼,而且越方便的地方越让人头疼,比如Lambda表达式。很多人因为Lamb......
  • ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
    ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑1.Elasticsearch产生背景大规模数据如何检索如:当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1)用什么数据库好?(mysql、oracle、mongodb、hbase…)2)如......
  • 伺服电机入门01
    伺服电机入门01伺服电机=电机+编码器,电机闭环电机:pmsmbldc有刷电机acim电机步进电机等,编码器:绝对编码器和增量编码器等编码器入门:信号:总线信号RS422RS485基础上面的总线方式以下面几种信号是可以细分,也就是通过细分增加编码器的分辨率,分辨率不直接代表编码器的精......
  • 【ROS2机器人入门到实战】通过JointStates控制RVIZ2关节
    8.4控制移动机器人轮子运动写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn我是小鱼,本节我们来看看如何手动的发送joint_s......
  • 【ROS2机器人入门到实战】动手创建一个移动机器人
    8.3动手创建一个移动机器人写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn大家好,我是小鱼,本节课我们来一起动手创建一个两......
  • 【ROS2机器人入门到实战】RVIZ2可视化移动机器人模型
    8.2RVIZ2可视化移动机器人模型写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn大家好,我是小鱼,上一节讲完joint和link,我们来......
  • 【ROS2机器人入门到实战】第 8 章 机器人建模
    第8章机器人建模写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn记得小时候,我眼中的机器人一直是钢铁侠那个样子,但后来开......
  • 【ROS2机器人入门到实战】学会使用RVIZ2-TF组件
    2.可视化坐标变换写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn运行上节课的示例,打开终端输入rviz2,打开rviz2,我们尝试在rv......
  • 【ROS2机器人入门到实战】坐标变换发布监听Python实现
    3.坐标变换发布监听Python实现写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn运行前面安装的jupyter,我们尝试使用代码来操......
  • 【ROS2机器人入门到实战】齐次坐标变换实战
    6.齐次坐标变换实战写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn上一节我们对齐次矩阵的组成和齐次矩阵的求逆和乘法两个......