Android---Kotlin 学习006

数字类型

和 java 一样,Kotlin 中所有数字类型都是有符号的,也就是说既可以表示正数,也可以表示负数

安全转换函数

与 java 不一样,kotlin 提供了 toDoubleOrNull 和 toIntOrNull 这样的安全转换函数,如果数值不能正确转换,与其触发异常不如干脆返回 null 值。 

示例:toIntOrNull。因为可能会返回空,所有 number 是可空类型。

fun main() {
    // "8.98".toInt() 会抛异常
    //val number : Int = "8.98".toInt()
    val number : Int? = "8.98".toIntOrNull() // TODO 当没有转换成功,则直接返回 null
    println(number)
}

 Double 转 Int 与类型格式化

Double.toInt() 会直接丢弃小数点后的数值,损失了精度。Double.roundToInt() 是四舍五入的方式。

import kotlin.math.roundToInt

fun main() {
    println(8.964565.toInt()) // 直接丢弃小数点后的值
    println(8.964565.roundToInt()) //四舍五入
}

Double 类型格式化。格式化字符串是一串特殊字符,它决定该如何格式化数据。

示例:

fun main() {
    val str = "%.2f".format(0.2694489)
    println(str)
}

解释说明:%.2f 即保留2位小数,并且是四舍五入。返回的结果是一个 String。

标准库函数

1) apply()

apply 函数可看作一个配置函数,你可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供 lambda 给 apply 函数执行,它会返回配置好的接收者。

解释说明:file1 是我们的通常写法,创建一个 File 对象,然后用这个对象来调用 read/write 等方法。file2 的写法就是通过配置函数的方式。将 read/write/execute 等方法配置在 apply() 函数中,然后返回给 file2 对象。将 File 对象传入到 apply 中(即那个 this),然后配置它。配置完之后再把这个 File 对象返回,即 file2(file2 就是接收者对象)。

可以看到,调用一个函数类配置接收者时,变量名就省掉了(即省掉 file1.setReadable() 中的 file1,而是直接调用 setReadable())。这是因为,在 lambda 表达式里,apply 能让每个配置函数都作用于接收者,这种行为有时又叫做相关作用域,因为 lambda 表达式里的所有函数调用都是针对接收者的,或者说,它们是针对接收者的隐式调用

2) let()

let 函数能使某个变量作用于其 lambda 表达式里,让 it 关键字能引用它。let 与 apply 比较,let 会把接收者传给 lambda,而 apply 什么都不传,匿名函数执行完,apply 会返回当前接收者,而 let 会返回 lambda 的最后一行。

示例:求一个集合里第一个数的平方

解释说明:这个 it 就是 first() 获取的集合中的第一个元素,并且把它传入到了 lambda 表达式中。

 如果不使用 let() 函数,那么计算一个数的平方,我们可能会这样写:

所以,使用 let 函数会方便很多。

3) run()

光看作用域行为,run 和 apply 差不多,但与 apply 不同,run 函数不返回接收者,run 返回的是 lambda 执行结果

    val file = File("D://run.txt")
    val txt : Boolean = file.run {
        readText().contains("xxx")
    }

解释说明:readText() 读取 run.txt 文件的内容,通过 contains() 查看是否包含 "xxx",如果包含则返回 true,不包含则返回 false。

run() 也能用来执行函数引用

fun main() {

    val isLong = "The People's Republic of China".run(::isLong)
    println(isLong)
}

fun isLong(name : String) : Boolean{
    return name.length >= 10
}

同时,支持多个函数链式调用。

示例:

fun main() {
    val isLong = "The People's Republic of China".run(::isLong)
    println(isLong)

    "The People's Republic of China"
        .run {::isLong}
        .run {::showMessage}
        .run {::printMes}
}

fun isLong(name : String) : Boolean{
    return name.length >= 10
}

fun showMessage(isLong : Boolean) : String{
    return if(isLong){
        "Name is too long!"
    }else{
        "Please rename!"
    }
}

fun printMes(Message : String){
    println(Message)
}

解释说明:isLong() 的结果(Boolean)作为参数传入 showMeage() 中,showMessage() 中然后的结果(String)又作为参数传入 printMes() 中。

4) with()

with 函数是 run 函数的变体,他们的功能行为是一样的,但 with 的调用方式不同,调用 with 时需要值参作为其第一个参数传入

5) also()

also 函数和 let 函数功能相似,和 let 一样,also 也是把接收者作为值参传给 lambda(即那个 it),但有一点不同:also 返回接收者对象,而 let 返回 lambda 结果。因为这个差异,also 尤其适合针对同一原始对象,利用副作用做事,既然 also 返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用

示例:

fun main() {

    var fileContexts : List<String>
    File("D://also.txt")
        .also {
            // 先打印 文件名称
            println(it.name)
        }
        .also {
            // 再把文件里的元素一行一行的读出来,赋值给 fileContexts
            fileContexts = it.readLines()
        }
}

 解释说明:第一个 also 打印 名字,然后返回 File 对象,所以第二个 also 也是同一个 File 对象再调用。

6) takeIf()

和其它标准函数有点不一样,takeIf 函数需要判断 lambda 中提供的条件表达式,给出 true 或 false 结果,如果判断结果为 true,从 takeIf 函数返回接收者对象,如果是 false,则返回 null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeIf 就非常有用。概念上讲,takeIf 函数类似于 if 语句,但它的优势是可以直接在对象实例上调用,避免了临时变量赋值的麻烦。

实例:

    val readText = File("D://takeIf.txt")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()

解释说明:当 {it.exists() && it.canRead()}(匿名函数) 结果为 true, 那么这一句 takeIf { it.exists() && it.canRead() } 返回接收者对象(即File),然后再调用 readText();如果{it.exists() && it.canRead()}的返回结果为 false,那么 takeIf()  返回 null。所以这里调用 readText() 函数时用到了安全调用操作符?.

注意:匿名函数{it.exists() && it.canRead()}是作为了 takeIf() 的参数,这里用的是简略写法

7) takeUnless()

takeIf 辅助函数 takeUnless,只有判断你给定的条件结果是 false 时,takeUnless 才会返回原始接收者对象。

​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FL Studio终身永久2024中文版下载安装详细操作图文步骤教程

FL Studio2024版是一款在国内非常受欢迎的多功能音频处理软件&#xff0c;我们可以通过这款软件来对多种不同格式的音频文件来进行编辑处理。而且FL Studio 2024版还为用户们准备了超多的音乐乐器伴奏&#xff0c;我们可以直接一键调取自己需要的音调。 FL Studio 2024版不仅拥…

早上好,我的leetcode 【hash】(第二期)

写在前面&#xff1a;坚持才是最难的事情 C代码还是不方便写&#xff0c;改用python了&#xff0c;TAT 文章目录 1.两数之和49. 字母异位词分组128.最长连续序列 1.两数之和 你好&#xff0c;梦开始的地方~ https://leetcode.cn/problems/two-sum/description/?envTypestudy…

PMP项目管理 - 采购管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. PMP项目管理 -…

Next.js加载异步组件 骨架屏

Next.js 中有两种处理页面加载的方式&#xff0c;一种是 Loading UI 一种是 Streaming。接下来我将介绍这两种的区别&#xff0c;以及实际的业务场景。 当我们进入某个页面时&#xff0c;需要获取页面数据&#xff0c;可能是从数据库读取也有可能是 API 服务&#xff0c;总之这…

Linux---进程概念

目录 一、冯诺依曼体系结构 二、操作系统 1.关于下三层的理解 2.关于上三层的理解 三、进程 1.进程(也叫做任务)对应的标识符---pid 2.fork---用代码创建进程(系统接口) 1&#xff09;初步认识一下fork 2&#xff09;fork函数的返回值 3&#xff09;fork的原理 问题1…

残差网络中的BN (Batch Normalization 批标准化层)的作用是什么?

文章目录 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09;一、BN层对输入信号进行以下操作:二、BN 层有什么作用&#xff1f; 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09; BN层的全称是Batch Normalization层,中文可以翻译为批标准化…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测

多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-LSSVM【23年新算法】基于霜冰优化算法(RIME)优化最小二乘向量机(LSSVM)多变量时间序列预测预测效果基本介绍模型描述程序设…

【最新版】在WSL上运行 Linux GUI (图形用户界面)应用(Gnome 文本编辑器、GIMP、Nautilus、VLC、X11 应用)

文章目录 一、 安装WSL1. 全新安装2. 现有 WSL 安装 二、运行 Linux GUI 应用1. 更新发行版中的包2. 安装 Gnome 文本编辑器启动 3. 安装 GIMP启动 4. 安装 Nautilus启动 5. 安装 VLC启动 6. 安装 X11 应用 适用于 Linux 的 Windows 子系统 (WSL) 现在支持在 Windows 上运行 Li…

深入比较Input、Change和Blur事件:Vue与React中的行为差异解析

目录 前言 1. Input事件&#xff1a; 行为差异&#xff1a; 2. Change事件&#xff1a; 行为差异&#xff1a; 3. Blur事件&#xff1a; 行为差异&#xff1a; 4. 在Vue中的表现&#xff1a; Input事件&#xff1a; Change事件&#xff1a; Blur事件&#xff1a; 5.…

Quartus 18.1软件及支持包安装教程

安装前最好关闭电脑的杀毒软件和防火墙 安装包可以到Quartus官网下载需要的版本&#xff0c;注意选择操作系统 Quartus官网&#xff1a;FPGA 设计软件 - 英特尔 Quartus Prime (intel.cn) 下载解压后以管理员的身份运行 QuartusSetup-18.1.0.625.exe文件&#xff0c;版本不同…

Vue中的数据变化监控与响应——深入理解Watchers

目录 ​编辑 前言 1. 基本用法&#xff1a; 2. 深度监听&#xff1a; 3. 立即执行&#xff1a; 4. 监听多个数据&#xff1a; 5. 清理监听器&#xff1a; 6. 监听路由变化&#xff1a; 总结&#xff1a; 我的其他博客 前言 在Vue.js中&#xff0c;watch是一种用于监听…

【Spring】Spring中的事务

文章目录 1. Spring事务简介2. Spring事务的案例案例代码代码目录结构数据库pom.xmlResource/jdbc.propertiesconfig/SpringConfig.javaconfig/JdbcConfig.javaconfig/MyBatisConfig.javadao/AccountDao.javaservice/AccountService.javaservice/impl/AccountServiceImpl.java测…

设计模式 简单工厂 工厂方法模式 抽象工厂模式

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

Command line is too long. Shorten command line for Application or also

一、问题描述 Error running ‘Application’: Command line is too long. Shorten command line for Application or also for Spring Boot default configuration? 二、原因分析 springboot项目启动命令过长&#xff01; 三、解决方案 第1步:点击项目启动配置项 第2步…

基于ssm的简单学校课程管理系统的设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm的简单学校课程管…

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能&#xff0c;发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

国内访问GitHub很卡,steam连接断开怎么办

目录 第一章、问题分析1.1&#xff09;问题1.2&#xff09;解决&#xff1a;下载个加速器就好了 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、问题分析 1.1&#xff09;问题 国内访问GitHub很卡怎…

数据分析(一)(附带实例和源码)

一、主要目的&#xff1a; 主要利用Python包&#xff0c;如Numpy、Pandas和Scipy等常用分析工具并结合常用的统计量来进行数据的描述&#xff0c;把数据的特征和内在结构展现出来。熟悉在Python开发环境中支持数据分析的可用模块以及其中的方法&#xff0c;基于一定的样例数据…

Windows中安装Git软件和TortoiseGit软件

1、git软件下载地址 https://git-scm.com/download/win 2、TortoiseGit软件下载 >https://tortoisegit.org/download/ 3、软件安装 4、环境安装说明 上面介绍的是在Windows中使用git&#xff0c;如果你电脑已经装了Ubuntu系统&#xff0c;可以直接在Ubuntu中使用git命令提…