Kotlin: "если элемент не в списке" правильный синтаксис

Учитывая синтаксис поиска списка котинов,

if (x in myList)

в отличие от идиоматической Java,

if (myList.contains(x))

как можно выразить отрицание? Компилятор не любит ни одно из них:

if (x not in mylist)

if !(x in mylist)

Есть ли идиоматический способ выразить это, кроме if !(mylist.contains(x)))? Я не видел, чтобы это упоминалось в Документах потока потока Kotlin.

Ответ 1

Используйте синтаксис x !in list.

Следующий код:

val arr = intArrayOf(1,2,3)
if (2 !in arr)
   println("in list")

скомпилируется до эквивалента:

int[] arr = new int[]{1, 2, 3};
// uses xor since JVM treats booleans as int
if(ArraysKt.contains(arr, 2) ^ true) { 
   System.out.println("in list");
}

Операторы in и !in используют любой доступный метод или метод расширения с именем contains и возвращают Boolean. Для коллекции (list, set...) используется метод collection.contains. Для массивов (включая примитивные массивы) используется метод расширения Array.contains, который реализуется как indexOf(element) >= 0

Ответ 2

Оператор для этого в Котлине !in. Таким образом, вы можете сделать

if (x !in myList) { ... }

Это можно найти в официальных документах о перегрузке оператора.