当前位置: 首页 > news >正文

【Kotlin】集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )

文章目录

  • 一、Map 集合
  • 二、获取 Map 值
  • 三、Map 遍历
  • 四、可变 Map 集合





一、Map 集合



调用 mapOf 函数 创建 Map 集合 , 键值对 元素有两种初始化方式 :

  • 使用 to 函数进行初始化 : 在参数中使用 键 to 值 的方式进行初始化 ;
  • 使用 Pair 对象进行初始化 : 传入 Pair(键, 值) 进行初始化 ;

to 函数原型如下 , 其本质也是返回 Pair 类型的实例对象 ;

/**
 * 从this和[that]创建类型为[Pair]的元组。
 * 这对于创建噪音更少的[Map]字面量很有用,例如:
 * @sample samples.collections.Maps.Instantiation.mapFromPairs
 */
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

代码示例 :

fun main() {
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    val map2 = mapOf(Pair("Tom", 18), Pair("Jerry", 12), Pair("Jack", 20))
    println(map2)
}

执行结果 :

{Tom=18, Jerry=12, Jack=20}
{Tom=18, Jerry=12, Jack=20}




二、获取 Map 值



获取 Map 值 :

  • 使用 取值运算符 [] 获取 Map 集合中的值 , 运算符中传入 键 , 如果找不到 键 对应的 值 , 返回 null ;
  • 使用 Map#getValue 函数 , 获取 键 对应的 值 , 如果没有找到则抛出异常 ;
	public fun <K, V> Map<K, V>.getValue(key: K): V = getOrImplicitDefault(key)
  • 使用 Map#getOrElse 函数 , 获取 键 对应的 值 , 如果没有找到则返回 Lambda 表达式 参数 的返回值 ;
	public inline fun <K, V> Map<K, V>.getOrElse(
		key: K, 
		defaultValue: () -> V): V = get(key) ?: defaultValue()
  • 使用 Map#getOrDefault 函数 , 获取 键 对应的 值 , 如果没有找到则返回默认值 ;
    public fun getOrDefault(key: K, defaultValue: @UnsafeVariance V): V {
        // See default implementation in JDK sources
        throw NotImplementedError()
    }

代码示例 :

fun main() {
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    val map2 = mapOf(Pair("Tom", 18), Pair("Jerry", 12), Pair("Jack", 20))
    println(map2)

    // 使用 取值运算符 `[]`  获取 Map 集合中的值 , 运算符中传入 键 , 如果找不到 键 对应的 值 , 返回 null
    println(map["Tom"])

    // 使用 Map#getValue 函数 , 获取 键 对应的 值 , 如果没有找到则抛出异常
    println(map.getValue("Tom"))

    // 使用 Map#getOrElse 函数 ,  获取 键 对应的 值 , 如果没有找到则返回 Lambda 表达式 参数 的返回值
    println(map.getOrElse("Tim", {20}))

    // 使用 Map#getOrDefault 函数 , 获取 键 对应的 值 , 如果没有找到则返回默认值
    println(map.getOrDefault("Tim", 88))
}

执行结果 :

{Tom=18, Jerry=12, Jack=20}
{Tom=18, Jerry=12, Jack=20}
18
18
20
88




三、Map 遍历



Map 遍历方式 :

  • forEach 函数 , 传入 Lambda 表达式参数 , 该 Lambda 表达式的参数为 Map.Entry<K, V> 类型 ;
public inline fun <K, V> Map<out K, V>.forEach(action: (Map.Entry<K, V>) -> Unit): Unit {
    for (element in this) action(element)
}
  • forEach 函数 , 传入 Lambda 表达式参数 , 该 Lambda 表达式的 两个参数为 实际的 键值对 的类型 ;
    default void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);
        for (Map.Entry<K, V> entry : entrySet()) {
            K k;
            V v;
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch(IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            action.accept(k, v);
        }
    }

代码示例 :

fun main() {
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    map.forEach {
        // 可操作 Entry 对象
        println("${it.key} = ${it.value}")
    }

    map.forEach { key: String, value: Int ->
        // 可获取具体的键和值
        println("$key = $value")
    }
}

执行结果 :

{Tom=18, Jerry=12, Jack=20}
Tom = 18
Jerry = 12
Jack = 20
Tom = 18
Jerry = 12
Jack = 20




四、可变 Map 集合



通过调用 mutableMapOf 函数 , 可创建 可变 Map 集合 ;

代码示例 :

fun main() {
    val mutableMap = mutableMapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(mutableMap)

    // 增加元素
    mutableMap += "Rose" to 18
    mutableMap.put("Tim", 21)
    println(mutableMap)

    // 查询是否有 某个键 对应的值, 如果没有则添加一个默认值进去
    mutableMap.getOrPut("Kate", {19} )
    println(mutableMap)
}

执行结果 :

{Tom=18, Jerry=12, Jack=20}
{Tom=18, Jerry=12, Jack=20, Rose=18, Tim=21}
{Tom=18, Jerry=12, Jack=20, Rose=18, Tim=21, Kate=19}

相关文章:

  • 西安汽车网站制作/活动推广方式都有哪些
  • 下载京东购物网/什么是优化设计
  • 东莞专业网/seo的外链平台有哪些
  • 网站建设哪个平台好/网址大全名称
  • 一线全屋定制10大品牌/网站内容如何优化
  • 做网站专业/数据分析培训班
  • 测试开发 | 测试人员必须掌握的测试用例
  • 17.优于select的epoll
  • 算法记录Day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • 使用mongostat命令实现zabbix监控mongodb
  • 2022 年 12 月区块链操作系统的开发回顾
  • 【PaaS】分享一家最近发现的宝藏Paas厂家
  • Java之节点流和处理流(Buffered字节字符处理流)
  • 集合框架及背后的数据结构
  • 基于Python分析气象数据教程-1
  • 蓝库云|2023年企业4个数字化转型关键,成功之路近在咫尺
  • Go GMP调度模型
  • 网络实验之OSPF路由协议(一)