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.BLUE
    println(Color.values())
    println(Color.valueOf("RED"))
    println(color.name)
    println(color.ordinal)
}

相应的控制台输出为:

 

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

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

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

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

相关文章

[C++]c++判断CPU的类型及支持的指令集

1、利用cpui判断cpu的类型及支持的指令集&#xff0c;可以进行条件编程&#xff1a;&#xff08;InstructionSet.h&#xff09; #pragma once// InstructionSet.cpp // Compile by using: cl /EHsc /W4 InstructionSet.cpp // processor: x86, x64 // Uses the __cpuid intrin…

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML&#xff08;异步Js和XML&#xff09;. 通俗的理解&#xff1a;在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式&#xff0c;就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…

单例模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练习.Model.单例模式 {//单例模式的实现in…

# Redis 分布式锁如何自动续期

Redis 分布式锁如何自动续期 何为分布式 分布式&#xff0c;从狭义上理解&#xff0c;也与集群差不多&#xff0c;但是它的组织比较松散&#xff0c;不像集群&#xff0c;有一定组织性&#xff0c;一台服务器宕了&#xff0c;其他的服务器可以顶上来。分布式的每一个节点&…

leetcode刷题(剑指offer) 50.Pow(x, n)

50.Pow(x, n) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#x…

一天吃透Java集合面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密&#xff08;推荐&#xff09; 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的&#xff0c;安全性太低 需求&#xff1a; 将密码加密后存储&#xff0c;提高安全性 二、密码加密…

【Axure教程0基础入门】04交互动效基础

04交互动效基础 1.Axure交互事件的基本概念 &#xff08;1&#xff09;交互动效Interaction 原型图中&#xff0c;原件与页面的动态效果&#xff08;dynamic behaviors&#xff09;。 &#xff08;2&#xff09;交互动效的构成 目标&#xff08;target&#xff09;&#xff1a;…

Kotlin基础——高阶函数和内联函数

高阶函数 高阶函数以另一个函数作为参数或者返回值&#xff0c;其可用Lambda或函数引用表示 函数类型 下面将Lambda存储在sum变量中&#xff0c;其是函数类型 val sum { x: Int, y: Int -> x y }完整的函数类型为(para1,prar2…) -> returnValue val a: Int 0 va…

Vue学习之nodejs环境搭建中的坑

Vue学习之nodejs环境搭建中的坑 1.nodejs安装后环境变量配置 &#xff08;1&#xff09;在nodejs安装目录下已有node_cache、node_global&#xff0c;如下&#xff1a; &#xff08;2&#xff09;在系统属性->环境变量中新建一个名为NODE_PATH的系统变量&#xff0c;值为n…

pytest框架的基本使用

1. 测试框架的作用 测试框架不关系用例的内容 它关心的是&#xff1a;用例编排和结果收集 2. pytest框架的特点 1. 适用于python语言 2. 用法符合python风格 3. 有丰富的生态 3. 安装pytest框架 1. 新建一个项目 2. 在项目终端窗口输入如下命令&#xff0c;用于安装py…

基于springboot网吧管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

Zygote的启动流程

在zygote进程对应的文件是app_main.cpp文件&#xff0c;在app_main.cpp文件的main()方法中先解析了init.rc中配置的参数并根据配置的参数设置zygote的状态。 在状态设置阶段主要做了&#xff1a; 设置进程名称为zygote通过startSystemServer true标示启动的是systemServer调…

6.s081 学习实验记录(三)system calls

文章目录 一、use gdb二、syscall&#xff1a;trace注意&#xff1a;实验代码&#xff1a;实验结果&#xff1a; 三、sysinfotips&#xff1a;实验代码实验结果 需要切换到 syscall 分支 一、use gdb 学习使用 gdb 调试 make qemu-gdb打开一个新的终端&#xff1a; gdb-mult…

换个思路快速上手UML和plantUML——时序图

上一章我们介绍了类图&#xff0c;我们很清楚&#xff0c;类图是从更加宏观的角度去梳理系统结构的&#xff0c;从类图中我们可以获取到类与类之间&#xff1a;继承&#xff0c;实现等关系信息&#xff0c;是宏观逻辑。下面我们继续换一个思路&#xff1a;作为一名软件工程结构…

【周赛】第382场周赛

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 从这一场&#xff08;第382场周赛&#xff09;周赛开始记录&#xff0c;目标是尽快达到准确快速AC前三道题&#xff0c;每场比赛…

贝莱德里程碑

作者&#xff1a;秦晋 见证奇迹的时刻。 1月27日&#xff0c;全球资产管理巨头贝莱德在美国证监会于1月10日审批通过比特币ETF的17天内&#xff0c;其比特币现货ETF资产管理规模已经突破20亿美元。持有比特币总数已达49952个。领跑其他9只比特币ETF机构参与者。不包括灰度GBTC&…

【JavaScript 漫游】专栏介绍

专栏介绍 本专栏旨在记录 JavaScript 核心语法&#xff0c;作为笔者日常学习和工作中的参考手册和代码示例仓库。 内容上力求覆盖 ES5、DOM、BOM 和 ES6 规范的所有内容。对于常用且重要的知识点&#xff0c;应该详细描述并附带有大量的代码示例。对于在工作场景中很少用到的…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 &#xff08;1&#xff09;查找元素是否存在 &#xff08;2&#xff09;查找最小元素 &#xff08;3&#xff09;查找最大元素 5.二分搜索…

算法39:统计全 1 子矩形(力扣1504)----单调栈

题目: 给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,0,1],[1,1,0],[1,1,0]] 输出&#xff1a;13 解释&#xff1a; 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩…