Сравнение шаблонов на кортежах в Котлине

У меня есть следующий код

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") } } 

который выглядит любезно загроможден для меня, когда я привык к этому в 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 } } 

Есть ли способ достичь чего-то подобного в Котлине?

Ну, ради Скалы, вы можете написать:

 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() } } 

Но я определенно предпочитаю:

 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 } 
Interesting Posts

Невозможно запустить глобальное приложение hello, как показано в O'Reilly – Введение в программирование Kotlin

Тесты Spring Boot не используют контекст повторно

Kotlin RxJava Nullable Bug

Нулевой указатель в поле зрения, когда запускается проверка андроида.

Новая архитектура с кинжалом и Котлином

Как использовать настраиваемый сеттер в корпусе конструктора класса Kotlin

Назначение отдельного элемента атрибуту значения IntArray в аннотациях Kotlin

Kotlin REPL с Android-классами unStub! Ed

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидается BEGIN_ARRAY, но был STRING в строке 1 столбца 2 пути

Kotlin – Идиоматический способ удаления повторяющихся строк из массива?

Тесты Kotlin и android lint

Объектный конструктор и Delegates.notNull

Несколько запросов retrofit2 с использованием Flowable в Котлине

Vert.x. Как создать реальное приложение многопользовательского JVM?

Невозможность запуска Инструментальные тесты в новом проекте Android Kotlin

Давайте будем гением компьютера.