Kotlin 这种方法有什么区别?
我正在学习Kotlin 这种方法有什么区别?,kotlin,Kotlin,我正在学习Kotlin。请帮我理解一下。据我所知,distinct只返回唯一的值。因此,如果我们有相同的值两次或更多次,它将只返回一次。如果我错了,请纠正我。 但是这个方法有什么区别呢?据我所知,它必须根据谓词返回唯一的值 我有这样的代码: fun main() { val myList = listOf(5, 2, 9, 12, 5, 2) myList.distinctBy { it > 10 }.forEach { println(it) } 所以它必须返回12imho,但我得到一
Kotlin
。请帮我理解一下。据我所知,distinct
只返回唯一的值。因此,如果我们有相同的值两次或更多次,它将只返回一次。如果我错了,请纠正我。
但是这个方法有什么区别呢?据我所知,它必须根据谓词返回唯一的值
我有这样的代码:
fun main() {
val myList = listOf(5, 2, 9, 12, 5, 2)
myList.distinctBy { it > 10 }.forEach { println(it) }
所以它必须返回12imho,但我得到一个输出:5,12。但是为什么呢?distinctBy
正在使用选择器对列表中的对象进行区分。这很少用于基本体。在您的情况下,为键true和false创建两个键映射,并且只映射前两个值
我假设您要过滤掉所有大于10的数字,您必须使用。请改为使用10}
。distinctBy
使用选择器对列表中的对象进行区分。这很少用于基本体。在您的情况下,为键true和false创建两个键映射,并且只映射前两个值
我假设您要过滤掉所有大于10的数字,您必须使用.filter{it>10}
返回仅包含给定集合中元素的列表
具有给定的[selector]函数返回的不同键
您将获得5 12
作为输出,因为您所做的类似于:
val myList = listOf(5, 2, 9, 12, 5, 2)
val set = HashSet<Boolean>()
val list = ArrayList<Int>()
for (e in myList) {
if (set.add(e>10)) {
list.add(e)
}
}
list.forEach { println(it) }
val myList=listOf(5,2,9,12,5,2)
val set=HashSet()
val list=ArrayList()
对于(myList中的e){
如果(设置添加(e>10)){
列表.添加(e)
}
}
list.forEach{println(it)}
返回仅包含给定集合中元素的列表
具有给定的[selector]函数返回的不同键
您将获得5 12
作为输出,因为您所做的类似于:
val myList = listOf(5, 2, 9, 12, 5, 2)
val set = HashSet<Boolean>()
val list = ArrayList<Int>()
for (e in myList) {
if (set.add(e>10)) {
list.add(e)
}
}
list.forEach { println(it) }
val myList=listOf(5,2,9,12,5,2)
val set=HashSet()
val list=ArrayList()
对于(myList中的e){
如果(设置添加(e>10)){
列表.添加(e)
}
}
list.forEach{println(it)}
distinctBy
接受选择器,而不是谓词。它通常用于对象,其中您需要基于特定字段进行区分。例如:
fun main() {
val list = listOf(
Pojo(1, "abc"),
Pojo(2, "xyz"),
Pojo(1, "hello"),
Pojo(1, "world")
)
list.distinctBy { it.fizz }.forEach { println(it) }
}
data class Pojo(
val fizz: Int,
val buzz: String
)
这将在fizz
属性上返回一个不同的值
Pojo(fizz=1, buzz=abc)
Pojo(fizz=2, buzz=xyz)
如果要使用谓词,应该使用类似于filter
的内容
val myList = listOf(5, 2, 9, 12, 5, 2, 13, 12)
myList.filter { it > 10 }.forEach { println(it) }
这将打印:
12
13
12
如您所见,filter
不会为您提供唯一的列表。您可以通过在筛选之前的列表上调用toSet()
(筛选之后的列表仍然是list
)来实现这一点。或者在筛选器之后调用distinct()
。distinct()
实际上只会创建一个Set
并将其重新打开为一个列表,因此我建议只在过滤器之前使用toSet()
。distinctBy
使用选择器,而不是谓词。它通常用于对象,其中您需要基于特定字段进行区分。例如:
fun main() {
val list = listOf(
Pojo(1, "abc"),
Pojo(2, "xyz"),
Pojo(1, "hello"),
Pojo(1, "world")
)
list.distinctBy { it.fizz }.forEach { println(it) }
}
data class Pojo(
val fizz: Int,
val buzz: String
)
这将在fizz
属性上返回一个不同的值
Pojo(fizz=1, buzz=abc)
Pojo(fizz=2, buzz=xyz)
如果要使用谓词,应该使用类似于filter
的内容
val myList = listOf(5, 2, 9, 12, 5, 2, 13, 12)
myList.filter { it > 10 }.forEach { println(it) }
这将打印:
12
13
12
如您所见,filter
不会为您提供唯一的列表。您可以通过在筛选之前的列表上调用toSet()
(筛选之后的列表仍然是list
)来实现这一点。或者在筛选器之后调用distinct()
。distinct()
实际上只需创建一个集合
并将其重新打开为一个列表
,因此我建议在筛选之前只使用toSet()
。感谢您的详细解释)@HaykMkrtchyan np,我还更改了最后一个注释。现在应该更好了。谢谢你这么详细的解释)@HaykMkrtchyan np,我也改变了最后一个音符。现在应该好多了。