鉴于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.
答案 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)
答案 2 :(得分:0)
尽管==
会将重复的数据类比较为相等,但是!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)){
}