Kotlin:"如果项目不在列表中#34;正确的语法

时间:2017-04-27 17:14:31

标签: kotlin

鉴于Kotlin的列表查找语法,

if (x in myList)

与惯用Java相反,

if (myList.contains(x))

怎么能表达否定?编译器不喜欢以下任何一种:

if (x not in mylist)

if !(x in mylist)

除了if !(mylist.contains(x)))之外,是否有一种惯用的表达方式?我没有在Kotlin Control Flow docs.

中看到它

4 个答案:

答案 0 :(得分:37)

使用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

答案 1 :(得分:13)

Kotlin的操作员是!in。所以你可以做到

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

您可以在有关operator overloading的官方文档中找到此信息。

答案 2 :(得分:0)

!in与匹配的数据类

尽管==会将重复的数据类比较为相等,但是!in并不认为重复的副本是相同的。

这是我的解决方法:

// Create a set of hashcodes
val itemHashes = myCollection.map { it.hashCode() }.toSet()

// Use !in with the set
item.hashCode() !in itemHashes

// For comparing a whole collection
myCollection.filter { it.hashCode() !in itemHashes }

答案 3 :(得分:-1)

if (myList!!.contains(x)){

    }

if (!myList!!.contains(x)){

    }