除了How to write a basic swap function in Java中描述的java方式之外,还有更好的方法在kotlin中编写通用交换函数。
是否有任何kotlin语言功能可以使通用交换功能更简洁直观?
答案 0 :(得分:40)
根本不需要在Kotlin中使用交换功能。您可以使用现有的also函数,例如:
var a = 1
var b = 2
a = b.also { b = a }
println(a) // print 2
println(b) // print 1
答案 1 :(得分:11)
如果你想写一些非常可怕的代码,你可以拥有这样的函数:
inline operator fun <T> T.invoke(dummy: () -> Unit): T {
dummy()
return this
}
这将允许您编写这样的代码
a = b { b = a }
请注意,我 NOT 推荐这个。只是表明它是可能的。
答案 2 :(得分:6)
修改:感谢@hotkey的评论
我相信交换两个变量的代码很简单 - 不要再尝试简化它了。
最优雅的实施形式恕我直言:
var a = 1
var b = 2
run { val temp = a; a = b; b = temp }
println(a) // print 2
println(b) // print 1
好处:
temp
不会留在范围内。答案 3 :(得分:3)
非常简单,快速且优雅的解决方案:
var a = 1
var b = 2
val (b0, a0) = a swap b
a = a0
b = b0
infix fun <A> A.swap(second: A): Pair<A, A> = second to this
答案 4 :(得分:2)
Kotlin鼓励尽可能使用不可变数据(例如使用val
而不是var
)。这大大减少了细微错误的变化,因为如果值不变,可以更合理地推理代码。
交换两个值与不可变数据完全相反:我是指交换之前或之后a
的值吗?
考虑以下列不可变方式重写代码:
val a = 1
val b = 2
val (a2, b2) = b to a
这可以通过使用destructuring declarations以及创建to
的内置Pair
扩展功能来实现。
答案 5 :(得分:1)
这是with的一个很好用法:
var a = 1
var b = 2
with(a) {
a = b
b = this
}
println(a) // 2
println(b) // 1
答案 6 :(得分:1)
更喜欢a = b。应用 {b = a}用于交换元素。 如果我们要对lambda内的变量执行某些操作,请继续 a = b。也 {someFun(它)}
答案 7 :(得分:0)
为了使用Kotlin duplicate class
,您可以创建这种扩展。它返回此列表的副本,其中索引a和b的元素被交换。
List
答案 8 :(得分:-1)
如果使用数组,则可以使用此:
fun <T> Array<T>.swap(i: Int, j: Int) {
with(this[i]) {
this@swap[i] = this@swap[j]
this@swap[j] = this
}
}