Kotlin中的交换功能

时间:2017-07-28 15:57:55

标签: kotlin

除了How to write a basic swap function in Java中描述的java方式之外,还有更好的方法在kotlin中编写通用交换函数。

是否有任何kotlin语言功能可以使通用交换功能更简洁直观?

9 个答案:

答案 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
    }
}