Kotlin Iterable.zip操作符使用记录

作用

假设有个场景需要将两个列表合成一个列表

列表1[1,2,3]
列表2["a", "b", "c"]
期望结果:
[(1, a), (2, b), (3, c)]

如果用java,最先想到的是遍历列表,循环往新列表插入新对象,但是项目该模块是kotlin的,发现有个很方便的方法。

private val list1 = mutableListOf(1, 2, 3)
private val list2 = mutableListOf("a", "b", "c")
val newList = list1.zip(list2)//newList为[(1, a), (2, b), (3, c)]

原理

其中zip是Iterable的扩展方法,它参数为另外一个迭代器,返回时List是个list

public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>> {
    return zip(other) { t1, t2 -> t1 to t2 }//最后一个参数为函数方法
}

看下重载的zip方法

public inline fun <T, R, V> Iterable<T>.zip(other: Iterable<R>, transform: (a: T, b: R) -> V): List<V> {
    val first = iterator()
    val second = other.iterator()
    val list = ArrayList<V>(minOf(collectionSizeOrDefault(10), other.collectionSizeOrDefault(10)))//取最小的列表数量
    while (first.hasNext() && second.hasNext()) {//成对才添加进新列表
        list.add(transform(first.next(), second.next()))//将两个数组的子元素转换成Pair元组
    }
    return list
}

其中transform是方法参数

{ t1, t2 -> t1 to t2 }

其中to是顶层扩展函数,在Tuples中

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

返回的是一个Pair,其中Pair是kotlin的二元元组,可以理解为两个参数的bean

总结

其实zip方法是将循环创建对象的过程封装起来,让我们开发变得高效,但是享受高效的同时还是要了解其中的原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值