Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 这种方法有什么区别?_Kotlin - Fatal编程技术网

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,我也改变了最后一个音符。现在应该好多了。