首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kotlin中运行函数

在Kotlin中运行函数
EN

Stack Overflow用户
提问于 2022-08-03 15:30:35
回答 2查看 129关注 0票数 0

我有个关于跑步功能的问题。

我完全理解最后的'eachCount()‘结果,但是运行函数给了我一点印象。

它是如何工作的?

id_list:"muzi","frodo",“A桃”,"neo“

报告:“木子佛罗多”、“水蜜桃蛙”、“佛罗多新”、“木子新”、“阿桃木子”

k: 2

答: 2,1,1,0

代码语言:javascript
复制
class Solution {
fun solution(id_list: Array<String>, report: Array<String>, k: Int): IntArray =
report.map { it.split(" ") }// [[muzi, frodo], [apeach, frodo], [frodo, neo], [muzi, neo], [apeach, muzi]]

    .groupBy { it[1] }//    {frodo=[[muzi, frodo], [apeach, frodo]], neo=[[frodo, neo], [muzi, neo]], muzi=[[apeach, muzi]]}

    .asSequence()
    .map { it.value.distinct() }//[[[muzi, frodo], [apeach, frodo]], [[frodo, neo], [muzi, neo]], [[apeach, muzi]]]

    .filter { it.size >= k }//  [[[muzi, frodo], [apeach, frodo]], [[frodo, neo], [muzi, neo]]]

    .flatten()//    [[muzi, frodo], [apeach, frodo], [frodo, neo], [muzi, neo]]

    .map { it[0] }//[muzi, apeach, frodo, muzi]

    .groupingBy { it }
    .eachCount()//  {muzi=2, apeach=1, frodo=1} -> run function's reciver object??
    .run { id_list.map { getOrDefault(it, 0)}.toIntArray() } -> I don`t know how it works.

}

EN

回答 2

Stack Overflow用户

发布于 2022-08-03 22:06:29

thing.run将您放在thing的作用域中,就好像您正在其类中运行代码一样,而在函数块中,thisthing。通常这是为了方便起见,所以您不必一直显式地引用对象:

代码语言:javascript
复制
// also useful for null-checking stuff before you try to do things with it!
thing?.run {
    doThing()
    println(someProperty)
}

let是类似的,但是它不是在成为接收者时调用的对象(函数中的this),而是作为参数传入:

代码语言:javascript
复制
thing?.let {
    // now you have to explicitly refer to the parameter
    it.doThing()
    println(it.someProperty)
}

有一些类似的接收器/参数作用域函数,它们做类似的事情,比如apply/also。你选哪一个取决于什么是最有意义的。如果您使用对象作为参数来调用对象,那么调用doThing(it) (或者重命名的参数,读起来更好!)可能更正确!比doThing(this)

代码中最重要的一点是,最后一行使用run let。这允许它引用链中那个阶段的两个不同的对象--这是之前发生的所有事情的结果( run调用了它,因此它变成了接收方,this)和map调用it中的当前项。

你基本上是在调用所有的东西,并产生一个Map。然后调用run,它将将该Map转换为另一个值,并允许您通过this访问Map。然后,通过在map上调用id_list并通过this.getOrDefaultMap进行查找(可以将其缩短为getOrDefault),从而生成要输出的值。

它基本上相当于:

代码语言:javascript
复制
val myMap = // big chain of operations
val lookup = id_list.map { myMap.getOrDefault(it, 0) }.toIntArray()
return lookup

只有run作为大链的一部分工作,将一个值转换为另一个值,而不声明中间变量。

顺便说一句,如果需要,可以使用let,因此涉及两个参数-一个来自let函数,一个来自map函数:

代码语言:javascript
复制
// giving it a name because you can't have two things called 'it'
.let { myMap -> id_list.map { myMap.getOrDefault(it, 0)}.toIntArray() }

但这可能不是个进步,对吧?不过,如果你想这样做,或者想要更明确的话,你也可以这么做!(能够命名参数是准确记录正在发生的事情的一种很好的方式-可能不清楚您所调用的runlet实际上是什么,而且名称可以帮助您)

票数 1
EN

Stack Overflow用户

发布于 2022-08-03 16:11:52

最后一行相当于

代码语言:javascript
复制
.run { id_list.map { this.getOrDefault(it, 0) }.toIntArray() } 

其中this.eachCount()在上一行返回的映射,itid_list的每个元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73223958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档