【Android】Kotlin教程(2)

文章目录

      • 1.空安全
      • 2.let安全调用
      • 3.非空断言操作符!!
      • 4.空合并操作符 ?:
      • 5.异常
      • 6.先决条件函数
      • 7.substring
      • 8.split函数
      • 9.replace
      • 10.字符串比较
      • 11.安全转换函数
      • 12.标准库函数
        • 1.apply
        • 2.run
        • 3.with
        • 4.also
        • 5.takeIf
        • 6.takeUnless

1.空安全

为了避免NullPointerException,Kotlin的做法是不让我们给非空类型变量赋null值,但是null在Kotlin中依然存在。

    var str1:String = "hello world"str1 = nullvar str2:String? = "hello world"str2 = null

在这里插入图片描述

2.let安全调用

let 是一个作用于对象的范围函数(scope function),它允许你在给定的对象上执行一段代码块,并且在这个代码块中可以访问该对象。let 函数的一个主要用途是避免空指针异常(NullPointerException),以及简化一些常见的操作。

1.避免空指针异常:

val name: String? = "Alice"
name?.let {println("Name is $it")
}

2.简化代码:

val nullableString: String? = "Hello, World!"
val length = nullableString?.let {println("Length before trimming: ${it.length}")it.trim().length
}println("Final length: $length")  // 输出 "Final length: 13"

3.返回值:

val nullableString: String? = " Hello, World! "
val trimmedLength = nullableString?.let {it.trim().length
}println(trimmedLength)  // 输出 13

4.链式调用:

val person = Person()
person.name?.let { name ->println("Person's name is $name")
} ?: run {println("Person's name is not set")
}

3.非空断言操作符!!

非空断言操作符 !! 用于告诉编译器你确定某个可空类型(nullable type)的变量或表达式实际上是非空的。使用这个操作符时,如果该变量或表达式的值是 null,则会抛出一个 KotlinNullPointerException。非空断言操作符通常用于那些你非常确定不会为 null 的情况,或者你希望在值为 null 时立即处理异常的情况。

    str2 = nullprintln(str2!!.capitalize())

在这里插入图片描述

4.空合并操作符 ?:

空合并操作符 ?: 是一个非常有用的操作符,用于处理可能为 null 的值。它允许你提供一个默认值,当表达式的结果为 null 时,将使用这个默认值。这有助于避免空指针异常,并使代码更加简洁和安全。

    val name: String? = nullval greeting = "Hello, ${name ?: "Guest"}!"println(greeting)  // 输出 "Hello, Guest!"

1.提供默认值:
当你需要为一个可能为 null 的变量提供一个默认值时,可以使用空合并操作符。

val name: String? = null
val greeting = "Hello, ${name ?: "Guest"}!"
println(greeting)  // 输出 "Hello, Guest!"

2.简化条件语句:

val nullableString: String? = null
val length = (nullableString?.length ?: 0)
println(length)  // 输出 0

3.链式调用:

data class Person(val name: String?, val address: Address?)
data class Address(val city: String?)val person: Person? = Person("Alice", Address(null))
val city = person?.address?.city ?: "Unknown City"
println(city)  // 输出 "Unknown City"

4.执行计算或逻辑:

val nullableInt: Int? = null
val result = nullableInt ?: computeDefaultValue()
println(result)fun computeDefaultValue(): Int {return 42
}

5.处理集合:
你可以用空合并操作符来处理可能为 null 的集合,并提供一个默认的空集合。

val list: List<String>? = null
val nonNullList = list ?: listOf()
println(nonNullList)  // 输出 []

5.异常

在 Kotlin 中,异常处理机制与 Java 类似,但有一些额外的特性和改进。Kotlin 使用 try, catch, finally 语句来处理异常,并且提供了一些额外的功能,如非局部返回和更简洁的语法。

fun main() {var number:Int? = nulltry {checkOperation(number)number!!.plus(1)}catch (e:Exception){println(e)}
}fun checkOperation(number: Int?){number ?: throw UnskilledException()
}class UnskilledException() : IllegalArgumentException("操作不当")

6.先决条件函数

先决条件函数(precondition function)通常是指在执行某个操作之前必须满足的条件。这些条件用于确保函数在安全和正确的状态下运行。如果先决条件不满足,函数可以选择抛出异常、返回错误代码或以其他方式处理这种情况。
在这里插入图片描述

7.substring

字符串截取,substring函数支持IntRange类型(表示一个整数范围的类型)的参数。

8.split函数

split函数返回的是List集合数据,List集合又支持结构语法特性,它允许你在一个表达式里给多个变量赋值,解构常用来简化变量的赋值。

const val NAMES = "jacky,jackson,jack"fun main() {val data = NAMES.split(",")val (origin,dest,proxy) = NAMES.split(",")println("$origin $dest $proxy")for (name in data) {println(name)}
}

9.replace

    val strt1 = "The people's Republic of China"val str2 = strt1.replace(Regex("[aeiou]")){when(it.value){"a" -> "*""e" -> "*""i" -> "*""o" -> "*""u" -> "*"else -> it.value}}println(strt1)println(str2)

10.字符串比较

在Kotlin中,用==检查两个字符串中的字符是否匹配,用===检查两个变量是否指向内存堆上同一对象,而在Java中==做引用比较,做结构比较时用equals方法。

    val str3 = "Jackon"val str4 = "jackon".capitalize()println("$str3   $str4")println(str3 == str4) // trueprintln(str3 === str4) // false

11.安全转换函数

安全转换函数,如果数值不能正确转换,与其触发异常不如干脆返回null

    val number:Int = "9".toInt() // 转换为Int类型val number1 :Int? = "9.0".toIntOrNull() // nullval number2 : Int = 9.87.roundToInt() // 10 四舍五入val number3 = "%.2f".format(9.8779000) // 9.88

12.标准库函数

1.apply
  • apply函数可以看做是一个配置函数,你可以传入一个接受者,然后调用一系列的函数来配置使用,如果提供lambda给apply函数执行,它会返回配置好的接受者。
  • apply 函数非常适合用于对象的初始化或配置,因为它允许你直接访问和修改对象的属性,而不需要显式地引用对象。
fun main(){val file1 = File("E://i have a dream_copy.txt")file1.setReadable(true)file1.setWritable(true)file1.setExecutable(true)val file2 = File("E://i have a dream_copy.txt").apply { setReadable(true)setWritable(true)setExecutable(true)}
}
2.run

run 是一个作用域函数(scope function),它允许你在对象的上下文中执行一段代码块,并且可以返回该代码块的结果。run 函数非常适合用于初始化对象、配置对象或执行一系列操作并获取结果。

val result = objectInstance.run {// 在这里可以访问和修改 objectInstance 的属性// this 指代 objectInstance// 返回值是代码块的最后一个表达式的值
}
  • objectInstance 是你要操作的对象。
  • { … } 是一个 lambda 表达式,在这个表达式中你可以直接访问和修改 objectInstance 的属性。
  • this 关键字在 lambda 表达式中指代 objectInstance。
  • run 函数返回 lambda 表达式的最后一个表达式的值。
fun main(){data class Person(var name: String, var age: Int)val person = Person("", 0).run {name = "Alice"age = 30this  // 返回当前对象}println(person)  // 输出 Person(name=Alice, age=30)
}

在这里插入图片描述


val result = "The people's Republic of China".run(::isLong)fun isLong(name : String) = name.length > 10
3.with

with 函数是一个作用域函数(scope function),它允许你在给定对象的上下文中执行一系列操作。与 apply 和 run 不同的是,with 需要显式地传递一个接收者对象,并且它返回的是 lambda 表达式的最后一个表达式的值,而不是接收者对象本身。

val result = with(objectInstance) {// 在这里可以访问和修改 objectInstance 的属性// this 指代 objectInstance// 返回值是代码块的最后一个表达式的值
}
fun main(){data class Person(var name: String, var age: Int)val person = Person("Alice", 30)val updatedPerson = with(person) {name = "Bob"age = 25this  // 返回当前对象}println(updatedPerson)  // 输出 Person(name=Bob, age=25)
}
4.also

also 是一个作用域函数(scope function),它允许你在给定对象的上下文中执行一系列操作,并且最终返回该对象本身。alsoapply 类似,但主要的区别在于 also 的 lambda 表达式中使用的是 it 来引用接收者对象,而不是 this。

val result = value.also { it ->// 在这里可以使用 value// it 代表 value
}
fun main(){data class User(var name: String, var email: String, var age: Int)val user = User("", "", 0).also {it.name = "Alice"it.email = "alice@example.com"it.age = 30}println(user)  // 输出 User(name=Alice, email=alice@example.com, age=30)
}
5.takeIf

takeIf 是一个非常有用的标准库函数,它允许你根据给定的条件选择性地返回对象。如果条件满足,则返回该对象;如果不满足,则返回 null。这使得takeIf成为处理条件逻辑和避免空指针异常的强大工具。

val result = value.takeIf { condition }
  • value 是你要检查的对象。
  • { condition } 是一个 lambda 表达式,它接受 value 作为参数并返回一个布尔值。
  • 如果 condition 为 true,则 takeIf 返回 value;否则返回 null。

条件过滤

fun main() {val numbers = listOf(1, 2, 3, 4, 5)val evenNumbers = numbers.filter { it.takeIf { it % 2 == 0 } != null }println(evenNumbers)  // 输出 [2, 4]
}

安全访问

val nullableString: String? = "  Hello, World!  "
val trimmedString = nullableString?.takeIf { it.isNotBlank() }?.trim()println(trimmedString)  // 输出 "Hello, World!"
6.takeUnless

takeUnless takeIf 的反向操作。takeUnless 函数允许你根据给定的条件选择性地返回对象。如果条件不满足(即条件表达式的结果为 false),则返回该对象;如果条件满足(即条件表达式的结果为 true),则返回 null。这使得 takeUnless 成为处理否定条件逻辑和避免空指针异常的强大工具。

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

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

相关文章

【2024|滑坡数据集论文解读3】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集

【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 文章目录 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式&#xff0c;经常要用到KaTex, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨&#xff0c;本着严谨治学的态度&#xff0c;整理了一下符号表的KaTex表示&#xff0c;希望有所帮助,整理过程中参考了《南瓜书》和 KaTex官…

Flutter TextField和Button组件开发登录页面案例

In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中&#xff0c;我们…

软件系统建设方案书(word参考模板)

1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…

ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259 进入界面&#xff0c;回显如下&#xff1a; highlight_file(__FILE__);$vip unserialize($_GET[vip]); //vip can get flag one key $vip->getFlag();题干里还提示了网站有一个flag.php界面&#xff0c;源代码如下&#xff1a; $xff explode(,, $_SERVER[HTTP_X…

Docker容器操作

Docker容器操作 启动容器 docker run -it 镜像名(镜像id) bash当利用docker run来创建容器时&#xff0c;Docker在后台运行的标准操作包括&#xff1a; 检查本地是否存在指定的镜像&#xff0c;不存在就从公有仓库中下载利用镜像创建并启动一个容器分配一个文件系统&#xf…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

医院信息化与智能化系统(9)

医院信息化与智能化系统(9) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀Retinexformer 代码2🍀🍀tasks里引用🚀创建yaml文件🚀测试是否创建成功前言:这篇论文提出了一种用于低光图像…

STM32应用详解(10)I2C总线初始化

文章目录 前言一、I2C总线初始化二、程序源码与详解1.I2C初始化2.I2C端口初始化及设置IO端口工作模式3.函数I2C_Init4.函数I2C_Cmd5.使能APB1外设时钟6.I2C通信时序图 前言 介绍STM32的I2C总线初始化&#xff0c;给出了代码详解。《i2c.h》文件&#xff0c;由用户编写。定义了…

系统聚类比较——最短距离法、最长距离法、重心法和类平均法

系统聚类概述 系统聚类&#xff0c;又称分层聚类法&#xff0c;是一种用于分析数据的统计方法&#xff0c;在生物学、分类学、社会网络等领域有广泛应用。以下是对系统聚类的详细概述&#xff1a; 一、基本思想 系统聚类的基本思想是将每个样品&#xff08;或数据点&#xf…

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去&#xff0c;或者产生的…

深入理解Python异常处理机制

在Python编程中&#xff0c;异常处理是一个非常重要的概念。它可以帮助我们捕获程序运行过程中出现的错误&#xff0c;防止程序崩溃&#xff0c;并提供友好的错误信息。本文将详细讲解Python的异常处理机制&#xff0c;并提供丰富的代码示例&#xff0c;帮助您更好地理解和应用…

【Spring MVC】响应结果和设置

​ 我的主页&#xff1a;2的n次方_ 1. 返回静态页面 先创建一个 html 页面 ​ 如果还按照之前的方式进行返回的话&#xff0c;返回的并不是一个 html 页面 RequestMapping("/response") RestController public class ResponseController {RequestMapping(&quo…

React基础使用教程

初识JSX React主要使用的就是jsx语法来编写dom&#xff0c;所以我们要先认识jsx&#xff0c;然后再开始学习两者相结合jsx其实就是在JS中编写HTML的一种写法编写jsx要注意以下几个规则&#xff1a; 定义虚拟DOM时&#xff0c;不要写引号标签中混入JS表达式时要用{}样式的类名指…

2024 Rust现代实用教程:1.3获取rust的库国内源以及windows下的操作

文章目录 一、使用Cargo第三方库1.直接修改Cargo.toml2.使用cargo-edit插件3.设置国内源4.与windows下面的rust不同点 参考 一、使用Cargo第三方库 1.直接修改Cargo.toml rust语言的库&#xff1a;crate 黏贴至Cargo.toml 保存完毕之后&#xff0c;自动下载依赖 拷贝crat…

形态学-闭运算

目录 依赖库显示图像的函数读取图像转换为灰度图像应用二值化阈值处理创建结构元素应用形态学闭运算显示结果 依赖库 首先&#xff0c;我们需要导入必要的库&#xff1a; import cv2 import numpy as npcv2 是OpenCV的Python接口&#xff0c;用于图像处理。numpy 是一个用于科…

在时间敏感网络中启用网络诊断:协议、算法和硬件

英文论文标题&#xff1a;Enabling Network Diagnostics in Time-Sensitive Networking: Protocol, Algorithm, and Hardware 作者信息&#xff1a; Zeyu Wang, Xiaowu He, Xiangwen Zhuge, Shen Xu, Fan Dang, Jingao Xu, Zheng Yang所属机构&#xff1a;清华大学软件学院和…