Kotlin快速入门系列7

Kotlin的数据类密封类枚举类

数据类

与Java等语言不同,kotlin创建只包含数据的类时,需要在类名前声明关键字:data。

data class KotlinBean (val brand : String)

在kotlin中,编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

· equals()
· hashCode()

· toString()

· componentN() functions (对应于属性,按声明顺序排列)

· copy()

如果这些函数已经在类中被明确定义了,或者从超类中继承而来,就不再会生成。不是所有的kotlin类都能声明为数据类,一般数据类声明都要满足以下条件:

· 主构造函数至少包含一个或多个参数;

· 所有的主构造函数的参数必须标识为val或var;

· 数据类不可声明为abstract,open,sealed或者inner;

· 数据类不能继承其他类(但是可以实现接口)。

Copy()

望词生意,此方法作用就是复制,我们可以使用该函数复制对象并修改部分属性,比如对于上面的KotlinBean类,实现类似下面示例:

fun copy(brand: String = this.brand) = KotlinBean(brand)

需要修改数据类的属性时用copy(),示例:

data class KotlinBean (val brand : String)fun main(args: Array<String>) {val jack = KotlinBean(brand = "Jack")val olderJack = jack.copy(brand = "olderJack")println(jack)println(olderJack)
}

对应控制台命令输出为:

数据类及其解构声明

解构声明,kotlin允许展示单个复合值,并使用它来初始化多个单独的变量。例如:

val pt=Point(111,222)
val (x,y)=pt
println(x) //打印111
println(y) //打印222

元组(标准数据类)

Kotlin的标准库提供了Pair(元组)和Triple(三元元组),可以把多个值同时赋给一个变量,或者同时给多个变量赋值。在新版的Kotlin中已经删除了多元元组,也就是只有Pair和Triple。

通常我们在对变量进行赋值时,只能附带一个值,例如:

val name = "batman"

通过元组对变量进行多个赋值,构造时也都可以通过泛型指定各个位置的对象类型:

fun main(args: Array<String>) {val batMan = Triple<String,String,Int>("Bluce","technology",10000)val jokerMan = Pair<String,String>("joker","Gotham")println(batMan.first)println(batMan.second)println(batMan.third)println("----------------------")println(jokerMan.first)println(jokerMan.second)
}

对应的控制台输出为:

 

可以发现Kotlin的元组在进行单独类多数据交互情景下比Java友好(Java还要先声明一个bean类然后进行set/get操作)。值得一提的是,上述示例也用到了元组的常用API,比如Pair的:

pair.first    //获取第一个元素
pair.second   //获取第二个元素

Tuples的方法:

tuples.first  //获取第一个元素
tuples.second //获取第二个元素
third.third //获取第三个元素

两个类还都有toList()方法可以把存储的对象转化为List,这里不做赘述。

密封类

密封类用于表示受限制的类层次结构,当一个值只能在一个集合中取值时,而不能取其他值时。在某种意义上,这是枚举类的扩展(枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例)。

声明密封类,需要用关键字sealed来修饰。被sealed修饰的类默认是open的,所以可以被继承,而不需要显式使用open修饰符。虽然密封类可以有子类,但是所有的子类必须要内嵌在密封类中。

sealed不能修饰interface,abstract class(会报warning,但是不会出现编译错误)

sealed class SealedClass{class ExtendClass1: SealedClass(){}class ExtendClass2: SealedClass(){}
}fun check(sealedClass: SealedClass): String =when(sealedClass){is SealedClass.ExtendClass1 -> "1"is SealedClass.ExtendClass2 -> "2"}

在密封类中使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。

枚举类

枚举类就是一组命名的常数,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

枚举类的最基本的用法是实现类型安全的枚举,其中枚举常量用逗号分隔,每个枚举常量都是一个对象。

enum class Color{RED,YELLOW,BLUE,GREEN
}

枚举初始化

每一个枚举都是枚举类的实例,它们都可以被初始化:

enum class Color(val rgb: Int) {RED(0xFF0000),YELLOW(0xFFFF00),GREEN(0x00FF00),BLUE(0x0000FF)
}

通常用法也较简单:

fun main(args: Array<String>) {println(Color.YELLOW.name)println(Color.YELLOW.ordinal)
}

对应的控制台输出为:

细心的你肯定会发现上述的两个参数.name和.ordinal。在枚举类中,每个枚举常量都具有在枚举类声明中获取其名称与位置的属性:

val name: String   //名称
val ordinal: Int   //枚举值所在枚举数组中定义的顺序

换言之,每个枚举类中的常量都可以 .name 拿到名称,.ordinal 拿到位置(从0开始算起)。

如果要指定位置,则可以使用其构造函数:

enum class Shape(value:Int){ovel(100),rectangle(200)
}

枚举类还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法。例如:

enum class Fruit {EATING {override fun signal() = DRINKING},DRINKING {override fun signal() = EATING};abstract fun signal(): Fruit
}

这里要注意的是,如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开。

使用枚举常量

Kotlin 中的枚举类具有合成方法,允许遍历定义的枚举常量,并通过其名称获取枚举常数。(假设枚举类的名称是 EnumClass)格式如下:

EnumClass.valueOf(value: String): EnumClass  // 转换指定 name 为枚举值,若未匹配成功,会抛出IllegalArgumentException
EnumClass.values(): Array<EnumClass>        // 以数组的形式,返回枚举值

对应的简单示例如下:

enum class Color {RED,YELLOW,BLUE,GREEN
}fun main(args: Array<String>) {var color:Color=Color.BLUEprintln(Color.values())println(Color.valueOf("RED"))println(color.name)println(color.ordinal)
}

相应的控制台输出为:

 

枚举常量还实现了 Comparable 接口,其中的自然顺序是它们在枚举类中定义的顺序,对此接口有兴趣的可以自己去尝试实现验证。

End,如有问题请留言交流。

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

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

相关文章

RabbitMQ-如何保证消息不丢失

RabbitMQ常用于 异步发送&#xff0c;mysql&#xff0c;redis&#xff0c;es之间的数据同步 &#xff0c;分布式事务&#xff0c;削峰填谷等..... 在微服务中&#xff0c;rabbitmq是我们经常用到的消息中间件。它能够异步的在各个业务之中进行消息的接受和发送&#xff0c;那么…

档案数字化转型面临问题

档案数字化转型面临以下问题&#xff1a; 1. 技术问题&#xff1a;档案数字化需要借助先进的技术手段和设备&#xff0c;包括扫描仪、存储设备和数据管理软件等。这些技术的成本高、操作复杂&#xff0c;需要专业的人员进行操作和维护。 2. 安全问题&#xff1a;档案数字化后的…

【Java程序设计】【C00176】基于SSM的图书管理系统(论文+PPT)

基于SSM的图书管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的图书管理系统 本系统分为前台系统、后台管理员以及后台学员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就…

gmsh 01 对多个面,及体进行剖分

#include <set> #include <cmath> #include <gmsh.h>#include <iostream>int main(int argc, char** argv) {gmsh::initialize(argc, argv); // 初始化gmsh::model::add("t2"); // 创建 t2 modeldouble lc 0.05; gmsh::model::geo::add…

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

斜率优化dp模型整理

300. 任务安排1&#xff08;300. 任务安排1 - AcWing题库&#xff09; 思路&#xff1a;很明显这些任务是按顺序排好的&#xff0c;我们能执行的操作只是对它们进行分批&#xff0c;我们可以发现每一批之前的开始时间s&#xff0c;影响的不仅仅是当前这一批的结束时间&#xff…

8.6跳跃游戏②(LC45-M)

算法&#xff1a; 与上一题一样&#xff0c;还是看最大覆盖范围 要从覆盖范围出发&#xff0c;不管怎么跳&#xff0c;覆盖范围内一定是可以跳到的&#xff0c;以最小的步数增加覆盖范围&#xff0c;覆盖范围一旦覆盖了终点&#xff0c;得到的就是最少步数&#xff01; 这里…

C++大学教程(第九版)7.30 打印array对象 7.31 逆序打印字符串(递归练习题)

文章目录 题目代码运行截图题目代码运行截图 题目 (打印array对象)编写一个递归函数printArray它以一个array对象一个开始下标和一个结束下标作为实参&#xff0c;不返回任何值并打印这个array对象。当开始下标和结束下标相等时&#xff0c;这个函数应该停止处理并返回。 代码…

跨镜网络解决方案:SD-WAN专线,实现企业全球互联

在全球化的背景下&#xff0c;越来越多的企业需要在海外社媒平台推广、研发访问海外平台、实现海外分部和国内互联互通等需求。然而&#xff0c;面对不同地区之间网络连接不稳定、高延迟、高成本等问题&#xff0c;如何实现企业的全球互联成为了一个亟待解决的难题。 幸运的是&…

laravel学习笔记

这两天公司活不多&#xff0c;学习了一下laravel框架。经过几天的学习&#xff0c;也对它有一些大概的了解。现在我就把我所学的到在这儿做下笔记吧。 一、laravel集合 其实&#xff0c;这里所说的集合&#xff0c;跟前端es6中的集合概念还是有那一点的不太一样。前端es6的集合…

C++ 数论相关题目:卡特兰数应用、快速幂求组合数。满足条件的01序列

给定 n 个 0 和 n 个 1 &#xff0c;它们将按照某种顺序排成长度为 2n 的序列&#xff0c;求它们能排列成的所有序列中&#xff0c;能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 1097 取模。 输入格式 共一行&#xff0c;包含整数 n 。 …

Java 集合 02 综合练习+基本数据类型对应的包装类

练习1、 自己写的代码&#xff1a; import java.util.ArrayList; public class practice {public static void main(String[] args) {//定义一个集合ArrayList<String> list new ArrayList<>();list.add("aaa");list.add("bbb");list.add(…

python实现豆瓣电影搜索并自动添加相关信息

1.豆瓣电影搜索 2.豆瓣电影信息自动添加 搜索 众所周知&#xff0c;豆瓣搜索有加密&#xff0c;得解密才行&#xff0c;还好网上众多大神都给破解了&#xff0c;那咱们拿来直接使用就行 相关代码仓库&#xff1a;xadmin-server/movies/utils/douban/search.py at movies nin…

React中使用LazyBuilder实现页面懒加载方法一

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

AJAX进阶(重点)

目录 ◆ 同步代码和异步代码 ◆ 回调函数地狱和 Promise 链式调用 什么是回调函数地狱&#xff1f; Promise - 链式调用 什么是Promise链式调用&#xff1f; Promise 链式应用 &#xff08;重点&#xff09; ◆ async 和 await 使用 async函数和await_捕获错误 ◆ 事…

二分查找|详细讲解|两种写法

二分查找 目录 1 介绍2 例题引入3 “左闭右闭”写法4 “左闭右开”写法 1 介绍 二分查找适用于从一个递增或递减的有序数列中查找某一个值 因此&#xff0c;使用二分查找的条件是&#xff1a; 用于查找的内容从逻辑上来看是有序的查找的数量只能是一个而不是多个 在二分查…

RAG应用-七个最常见的故障点

近日&#xff0c;国外研究者发布了一篇论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》&#xff0c;探讨了在实际工程落地RAG应用过程中容易出的七类问题。 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 一、丢失内容&…

【Go-zero】手把手带你在goland中创建api文件并设置高亮

【Go-zero】手把手带你在goland中创建api文件并设置高亮 大家好 我是寸铁&#x1f44a; 总结了一篇手把手带你在goland中创建api文件并设置高亮解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题复盘 在使用go-zero 框架时&#xff0c;常常需要用到goctl 一键生成…

简单易用的购物车

实现了购物基本功能&#xff0c;那来修改一下就可以用&#xff0c;app,h5,小程序都可以 购物车插件 - DCloud 插件市场

会话技术复习笔记

一.登录校验的需求 什么是登录校验&#xff1f; 所谓登录校验&#xff0c;指的是我们在服务器端接收到浏览器发送过来的请求之后&#xff0c;首先我们要对请求进行校验。先要校验一下用户登录了没有&#xff0c;如果用户已经登录了&#xff0c;就直接执行对应的业务操作就可以…