Kotlin基础——类型系统

news2024/11/26 15:22:21

?

对于如下Java函数,可传递null或者值为null的String

int strLen(String s) {
    return s.length();
}

而在Kotlin中,如下函数不能传递null或值为null的String,否则会在编译期报错,保证了永远不会在运行时报空指针异常

fun strLen(s: String) = s.length

如果接收null,需要在类型名称后面加上?标记

fun strLen(s: String?): Int =
    if (s != null) s.length else 0

?.

把一次null检查和方法调用合并成一个操作,为空时返回null

fun printAllCaps(s: String?) {
    val allCaps: String? = s?.toUpperCase()
    println(allCaps)
}

调用结果也是可空的,如下打印ABC、null

println("abc")
println(null)

?:

同上,但为空时返回冒号后面的默认值,如下s为空返回""

fun foo(s: String?) {
    val t: String = s ?: ""
}

as?

把值转换成指定的类型,若转换失败则返回null

class Person(val name: String) {
    override fun equals(other: Any?): Boolean {
        val otherPerson = other as? Person ?: return false
        return otherPerson.name == name
    }
}

!!

把值转换成非空类型,若为空则抛出异常,堆栈信息只会表明异常发生在哪一行代码,而不是哪一个表达式,应避免在同一行使用多个!!

fun ignoreNulls(s: String?) {
    val sNotNull: String = s!!
    println(sNotNull.length)
}

let

当把可空值作为实参传递给非空值的函数时,可使用let

fun sendEmailTo(email: String) {
    println("sendEmailTo")
}

let只会在值非空时调用

val email1: String? = "AAA"
email1?.let { sendEmailTo(it) }

val email2: String? = null
email2?.let { sendEmailTo(it) }

延迟初始化

如下每次使用myService变量,都需要判空

class MyService {
    fun getService(): String = "Service"
}

class Test {
    private var myService: MyService? = null
    
    fun setUp() {
        myService = MyService()
    }
    
    fun action() {
        myService?!.getService()
    }
}

可使用lateinitb表明变量可以延迟初始化,不用先置为null,省去判空条件

class MyService {
    fun getService(): String = "Service"
}
class Test {
    private lateinit var myService: MyService
    fun setUp() {
        myService = MyService()
    }
    fun action() {
        myService.getService()
    }
}

可空类型的扩展函数

String的扩展函数isNullOrBlank()判断当前字符串是否为空或者空白,this可能为null,若不为null,则可以安全调用isBlank()

public inline fun CharSequence?.isNullOrBlank(): Boolean {
    return this == null || this.isBlank()
}

类型参数的可空行

Kotlin所有泛型类和泛型函数的类型参数默认都是可空的,如下函数可传递null

fun <T> printHashCode(t: T) {
    println(t?.hashCode())
}

要使类型参数非空,必须指定一个非空的上界

fun <T : Any> printHashCode(t: T) {
    println(t.hashCode())
}

可空性和Java

Java使用@Nullable表示可为空,@NotNull表示非空,当不存在注解时,会作为Kotlin的平台类型(即不知道可空性的类型),由开发者自己处理

基本数据类型

  • Kotlin非空的基本数据类型转换为Java的基本数据类型
  • Kotlin可空的基本数据类型转换为Java的基本数据包装类

数字转换

Kotlin不会自动转换类型,需要显示调用转换函数

val i = 1
val l: Long = i.toLong()

Any、Any?

Any是所有类型的父类,对应于Java的Object

Unit

当函数未声明返回值类型时,默认为Unit,对应于Java的void

fun f() {
    
}

fun fu(): Unit {

}

Unit可以作为泛型的类型参数,而void不行,如下使用Unit作为返回值,不用显示return

interface Processor<T> {
    fun process(): T
}

class NoResultProcessor : Processor<Unit> {
    override fun process() {
        
    }
}

Nothing

Nothing没有任何值,只有被当作函数返回值,或者当作泛型函数返回值的类型参数才有意义

fun fail(msg: String): Nothing {
    throw IllegalStateException(msg)
}

集合

可空性和集合

需要注意,集合可空性和集合元素可空性是不一样的

fun addValidNumbers(numbers: List<Int?>) {
    var validNumbers = 0
    for (number in numbers) {
        if (number != null) {
            validNumbers += number
        }
    }
}

可使用库函数优化

fun addValidNumbers(numbers: List<Int?>) {
    var validNumbers = numbers.filterNotNull().sum()
}

只读集合和可变集合

Collection中的方法都是读取集合的操作,MutableCollection才包含写集合的操作

fun <T> copyElements(source: Collection<T>, target: MutableCollection<T>) {
    for (item in source) {
        target.add(item)
    }
}

只读集合不一定是不可变的,可能同时有MutableCollection引用它

Koltin集合和Java

一种Java集合在Kotlin都有只读和可变两种表示,不能保证传递给Java的集合不会被修改及添加null

在这里插入图片描述

数组

  • arrayOf() 创建包含指定参数的数组
  • arrayOfNulls() 创建可空数组
  • Array() 调用Lambda表达式构建数组元素
val letters = Array<String>(26) { i -> ('a' + i).toString() }

数组的类型参数会被成为对象类型,若要生成基本数据类型的数组,可以使用xxxArray()

val a = IntArray(5)
val b = intArrayOf(0, 1, 2, 3, 4)
val c = IntArray(5) { i -> (i + 1) }

println(a.joinToString(" "))	// 0 0 0 0 0 
println(b.joinToString(" "))	//0 1 2 3 4
println(c.joinToString(" "))	//1 2 3 4 5

可对装箱的数组或集合转为基本数据类型的数组

val list = listOf<Int>(1, 2, 3)
val array = list.toIntArray()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器修复

服务器修复 主要服务器漏洞展示未禁用sync、shutdown、halt默认账户。未创建系统管理员、审计管理员、安全管理员账户设置系统管理员设置安全管理员 设置审计管理员配置PASS_MAX_DAYS 99999、PASS_MIN_LEN 5未配置TMOUT值配置HISTSIZE0未配置登录失败/密码复杂度策略umask值022…

【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数

8.10 函数的默认参数 C在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值&#xff0c;当函数调用的时候如果没有指定这个值&#xff0c;编器会自动用默认值代替。 通过为函数参数指定默认值&#xff0c;可以在调用函数时省略相应的参数&#xff0c;而该参数将使用…

喜报 | 再获影响力产品奖!擎创科技实力亮相GOPS全球运维大会

10月26日-27日&#xff0c;为期两天&#xff0c;共1100余人签到的 GOPS 全球运维大会 2023 上海站已经圆满落幕。 此次会议的“2023 IT技术领导力年度颁奖典礼”中&#xff0c;擎创夏洛克AIOps数智运维管理平台凭借成熟的产品能力及广泛且优异的落地实践效益&#xff0c;得到了…

【寒武纪(6)】MLU推理加速引擎MagicMind,最佳实践(二)混合精度

混合精度在精度损失范围内实现数倍的性能提升。 支持的量化特性 构建混合精度的流程 构建混合精度的流程如下&#xff0c;支持浮点或半精度编程&#xff0c;以及量化精度编程两种方式。 浮点或半精度 无需提供tensor分布量化编程需要设置tensor分布。 网络粒度和算子粒度的设…

【智能算法】季节优化算法Seasons optimization algorithm【2023最新智能优化算法合集】

本文介绍了一种基于成吉思汗鲨鱼(Genghis Khan shark&#xff0c;GKS)行为的自然启发的元启发式算法(MA)&#xff0c;称为成吉思汗鲨鱼优化器(Genghis Khan shark optimizer&#xff0c;GKSO)&#xff0c;用于数值优化和工程设计。GKSO的灵感来自于GKS的捕食和生存行为。该成果…

【分布式系统学习】CAP原理详解

CAP原理详解 前言CAP一张图 一、概念1.1 关键词解读1.2 关于CAP&#xff08;拆分解读&#xff09;1.3 CAP原理精髓 二、CAP模拟场景举例理解三、CAP原理证明为什么不能同时满足&#xff08;下面举例说明&#xff09;3.1 必须满足分区容错性P下的处理方式3.2 不是必须满足分区容…

自定义Windows服务启动失败

文章目录 自定义Windows服务启动失败报错内容解决方案管理员身份运行cmd进入到InstallUtil.exe的路径&#xff0c;使用cd命令。使用InstallUtil.exe工具安装服务。 自定义Windows服务启动失败 报错内容 “无法从命令行或调试器启动服务&#xff0c;必须首先安装Windows服务(使…

《opencv实用探索·四》Mat图像数据类型转换和归一化显示

一种数据类型转为另一种数据类型&#xff0c;不改变图像大小&#xff0c;但每个像素值可能会变 src.convertTo(dst, type, scale, shift);Scale和shitf默认为0&#xff08;这两个参数也相当于对比度和亮度&#xff09; 现在有个8位图像&#xff0c;把8位转成32位 可以看到像素…

【EI稳定检索】第三届绿色能源与电力系统国际学术会议(ICGEPS 2024)

第三届绿色能源与电力系统国际学术会议&#xff08;ICGEPS 2024&#xff09; 2024 3rd International Conference on Green Energy and Power Systems 绿色能源是指可以直接用于生产和生活的能源。它包括核能和“可再生能源”。随着世界各国能源需求的不断增长和环境保护意识…

人工智能 -- 技术概览

1、我们身处人工智能的时代 人们从早期做web开发&#xff0c;到移动端的开发&#xff1b;之后随着数据量的增大&#xff0c;人们开始研究高并发的问题&#xff1b;当数据量不断的增大&#xff0c;而人们希望数据不被浪费时&#xff0c;产生了大数据的技术&#xff0c;包括&…

国标GB28181协议/RTSP视频监控汇聚平台EasyCVR(V.3.4)页面UI大更新

为提高用户体验&#xff0c;增强平台功能&#xff0c;旭帆科技的Easy系列平台也在不断优化更新中。在最新的EasyCVR&#xff08;V.3.4&#xff09;中&#xff0c;其最显著的区别即为首页UI的调整。 其亮点是在【配置中心】-【基础配置】-【展示信息】中&#xff0c;首页UI可分…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下&#xff1a; package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…

品牌全渠道营销系统如何与不同经销商ERP打通

品牌商在与各经销商ERP系统打通方面面临的挑战。传统的ERP系统往往使得数据收集和合作变得繁琐且低效&#xff0c;导致市场响应迟缓&#xff0c;影响整体的供应链管理和市场决策。我们的解决方案旨在破解这一难题&#xff0c;提供一个全渠道营销系统&#xff0c;它能自动与各类…

啊哒-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;啊哒 作者&#xff1a;第七届山东省大学生网络安全技能大赛 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 图片的话还是老三样斧winwalk、010Editor、Stegsolve。ok直接开搞&#xff01; 解题…

Typora .MD笔记中本地图片批量上传到csdn (.PNG格式)(无需其他任何图床软件)

Typora .MD笔记中本地图片批量上传到csdn &#xff08;.PNG格式&#xff09;(无需其他任何图床软件) 截图软件推荐 qq 截图 快捷键 ctrlshiftA. 步骤一 设置Typora 的图片 点击文件. 点击偏好设置 ->图像 我们可以选择将图片复制到我们的文件夹中。 建议刚写好文件标题就…

element ui 表格合计项合并

如图所示&#xff1a; 代码&#xff1a; <el-table height"400px" :data"tableData " borderstyle"width: 100%"stripe show-summaryref"table"id"table"> </el-table>监听表格 watch: { //监听table这个对象…

OBC、DCDC自动化测试解决方案!

OBC(车载充电机&#xff09;和DCDC&#xff08;直流-直流变换器&#xff09;是电动汽车的核心部件&#xff0c;DCDC和OBC的功能质量对于整车的性能和安全性至关重要。在OBC和DCDC&#xff0c;以及整车开发测试过程中&#xff0c;需要对OBC和DCDC进行功能和性能方面进行全面的测…

银河麒麟高级服务器操作系统V10安装达梦数据库管理系统DM8——单实例

一、介绍 之前介绍过供个人学习在VMware虚拟机上安装银河麒麟高级服务器操作系统V10&#xff0c;有兴趣的可以去看看&#xff08;银河麒麟V10安装&#xff09;&#xff0c;本次主要学习在银河麒麟V10上安装达梦数据库-DM8。DM8是达梦公司在总结DM系列产品研发与应用经验的基础…

明天就删,限时领取。zui全拼多多直播问题答疑文档合集。

直播流程是什么&#xff1f;什么时间要做什么事&#xff1f;直播带货播出什么数据才算好?怎么提高直播间流量指标&#xff1f;付费起号还是自然起号好&#xff1f;大小循环话术和场控话术怎么说?今天为大家分享一份“zui全直播500问”&#xff1a; 以上内容为“zui全直播500问…

消息队列进阶-3.消息队列常见问题解决方案

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…