IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin - 元组 Pair、Triple -> 正文阅读

[移动开发]Kotlin - 元组 Pair、Triple

????????通常情况下一个变量只能携带一个值,解决方法是自定义一个类,写法过于复杂(定义很多字段、不同字段组合都要专门定义构造),而元组可以把多个值同时赋值给一个变量。

????????可以用于函数返回多个值,也可以作为一种数据结构使用,他们可以解构声明,同时因为他们实现了Serializable接口,在Android开发中也可以通过Intent传递。

????????Pair 二元元组:可以携带两个值

????????Tuple 三元元组:可以携带三个值

val two: Pair<String,Int> = Pair(18,"张三")???
val three = Triple<Int,String,Boolean>(22,"李四",true)
println("三元元组的内容:${three.first}、${three.second}、${three.third}")

一个函数返回多个值(返回数据类对象或者元组)

fun getPair(): Pair<String, Int> {
    return Pair("hhh", 666)
}

val (a, b) = getPair()

Android中Intent传递

//Acitivty1
startActivity(intent.apply { putExtra("hhh", Pair(1, 2)) })
//Activity2
val (a, b) = intent.getSerializableExtra("hhh") as Pair<*, *>
println("a = $a , b = $b")      //输出:a = 1 , b = 2

可以根据元组的原码自定义元组

public data class Triple<out A, out B, out C>(
    public val first: A,
    public val second: B,
    public val third: C
) : Serializable {
    public override fun toString(): String = "($first, $second, $third)"
}

解构声明 Destructuring Declarations

有时候获取一个对象的属性会定义很多变量去接收,使用解构声明能一次性给多个变量同时赋值。对于每一个解构的变量,在访问时实际最终都会调用解构对象的componentN()方法,而N就是声明时括号里变量的位置,从1开始。

val person = Person("张三", 18)
//通常
var name = person.name
var age = person.age
//解构声明
val (name, age) = person    //声明了两个变量,可以单独使用
println(name) // 打印:张三
println(age) // 打印:18

val (a, b) = Pair(4, "5")
println("$a,$b")
val (i, j, k) = Triple(1, "a", 2.0)
println(i.javaClass.name+","+j.javaClass.name+","+k.javaClass.name)

自定义解构声明的类

想让一个类的对象支持解构声明,就必须实现componentN 方法,同时方法前需要加上operator关键字。data class 自动实现了相关方法支持解构声明。

class Point(var x: Int, var y: Int) {
    operator fun component1() = x
    operator fun component2() = y
}

在数组集合中使用

//Array
val array = arrayOf(1, 2, 3)
val (a1, a2, a3) = array
//Collection
val list = listOf(1, 2, 3)
val (b1, b2, b3) = list
//Map
for ((key, value) in map) {
    println("$key-$value")
}

在Lambda中使用

如果 lambda 表达式具有 Pair 类型(或者 Map.Entry 或任何其他具有相应 componentN 函数的类型)的参数,那么可以通过将它们放在括号中来引入多个新参数来取代单个新参数。

map.mapValues { entry -> "${entry.value}!" }    //替换为下面这行
map.mapValues { (key, value) -> "$value!" }

{ a //-> …… }       // 一个参数
{ a, b //-> …… }    // 两个参数
{ (a, b) //-> …… }  // 一个解构对
{ (a, b), c //-> …… } // 一个解构对以及其他参数

忽略不需要的解构值?

解构中有用不到的值,可以使用下划线代替,省略掉不必要的声明(命名),也不会调用相应的 compoentN() 方法了。

map.mapValues { (_, value) -> "$value!" }

val book = Book(1, "英语")
val (id, _) = book

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:41:49  更:2022-03-15 22:42:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:41:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码