我有以下代码

fun changeSelection(item: FileOrFolder, selected: Boolean) {
    selection = when(item) {
        is Folder -> {
            when(selected) {
                true -> selection + item
                false -> selection - item
            }
        }
        is File -> {
            when(selected) {
                true -> selection + item
                false -> selection - item
            }
        }
        else -> throw Exception("unreachable")
    }
}

which looks kinda cluttered for me as I got used to this in scala

def changeSelection(item: FileOrFolder, selected: Boolean) {
    (item, selected) match {
        case (item: Folder, true) => selection + item
        case (item: Folder, false) => selection - item
        case (item: File, true) => selection + item
        case (item: File, false) => selection - item
    }
}

Is there a way to achieve something similar in Kotlin?

推荐答案

看在Scala的份上,你可以写:

fun changeSelection(item: FileOrFolder, selected: Boolean) {
    selection = when {
        item is Folder &&  selected -> selection + item
        item is Folder && !selected -> selection - item
        item is File   &&  selected -> selection + item
        item is File   && !selected -> selection - item
        else -> throw Exception()
    }
}

更直截了当的版本应该是:

fun changeSelection(item: FileOrFolder, selected: Boolean) {
    selection = if(selected)
        when(item) {
            is Folder -> selection + item
            is File   -> selection + item
            else -> throw Exception()
        }
    else
        when(item) {
            is Folder -> selection - item
            is File   -> selection - item
            else -> throw Exception()
        }
}

But I definitely prefer:

operator fun Selection.plus(f: FileOrFolder) = ...
operator fun Selection.minus(f: FileOrFolder) = ...

fun changeSelection(item: FileOrFolder, selected: Boolean) {
    if(selected)
        selection += item
    else 
        selection -= item
}

Kotlin相关问答推荐

某些公共函数显然不能在类实例上访问;Klaxon示例

如何编写带有依赖项的自定义Kotlin串行化程序?

在Spring Boot应用程序中使用网络请求功能将关键字挂起作为冗余

如何在Spring Boot中注册新的集合工厂

修改器的属性是什么,我需要更改以使角变圆且宽度更小?喷气背包组合

Kotlin 启动与启动(Dispatchers.Default)

如何将 `throw` 放置在辅助函数中但仍然具有空安全性?

如何在 jOOQ 中两次加入同一张表?

Jetpack BottomNavigation - java.lang.IllegalStateException:Already attached to lifecycleOwner

为什么我们在 kotlin 中需要 noinline?

Android Room - error: Cannot figure out how to save this field into database

Kotlin 具体化的泛型不会按计划保持类型

Kotlin中的测试无法访问受保护(protected)的方法

Kotlin-通过与属性列表进行比较来筛选对象列表

Kotlin 扩展函数 - 覆盖现有方法

API 26 上未显示 Android 通知

Kotlin:具有多个不同类型设置器的单个属性

在Kotlin中为Android编写库会有开销吗?

将 Double 转换为 ByteArray 或 Array Kotlin

安装 Kotlin-Jupyter:e: java.lang.NoClassDefFoundError: 无法初始化类 org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel