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 在Iterable.sortedBy内执行挂起函数_Kotlin_Kotlin Coroutines - Fatal编程技术网

Kotlin 在Iterable.sortedBy内执行挂起函数

Kotlin 在Iterable.sortedBy内执行挂起函数,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我有以下代码: interface Film { suspend fun total(): Int } suspend fun getFilms() : List<Film> { return films.sortedBy { it.total() } } 界面膜{ suspend fun total():Int } 挂起有趣的getFilms():列表{ 返回films.sortedBy{it.total()} } 但我得到一个错误,因为我在非暂停函数(sorte

我有以下代码:

interface Film {

  suspend fun total(): Int

}

suspend fun getFilms() : List<Film> {
  return films.sortedBy { it.total() }
}
界面膜{ suspend fun total():Int } 挂起有趣的getFilms():列表{ 返回films.sortedBy{it.total()} }
但我得到一个错误,因为我在非暂停函数(
sortedBy
selector)中调用
Film::total
方法。如何解决这个问题?

我想这只是一个警告,无论如何,您可以使用
runBlocking

suspend fun getFilms() : List<Film> {
    val films = arrayListOf<Film>()
    return films.sortedBy { runBlocking {  it.total() } }
}
suspend fun getFilms():列表{
val films=arrayListOf()
返回films.sortedBy{runBlocking{it.total()}
}

我想这只是一个警告,无论如何,你可以使用
运行阻塞来强制它运行

suspend fun getFilms() : List<Film> {
    val films = arrayListOf<Film>()
    return films.sortedBy { runBlocking {  it.total() } }
}
suspend fun getFilms():列表{
val films=arrayListOf()
返回films.sortedBy{runBlocking{it.total()}
}
suspend fun getFilms():列表{
返回电影
.map{it to it.total()}
.sortedBy{it.second}
.map{it.first}
}
suspend fun getFilms():列表{
返回电影
.map{it to it.total()}
.sortedBy{it.second}
.map{it.first}
}

该错误明确指出“只能在协同程序体内调用暂停功能”。您正从sortedBy中调用total(),因此出现了错误。 你应该提供更多的上下文,以便我能够提供更准确的答案。有了这样小的上下文,就可以从total()中删除suspend,让代码编译。无论如何,试试这个:

suspend fun getFilms() = films.sortedBy { it.total() }
如果您无法更改接口,那么类似这样的内容会怎么样:

data class MyFilm(val total: Int) : Film {
    override suspend fun total(): Int = total 
}

suspend fun getFilms(): List<Film> = withContext(Dispatchers.Default) {
   films.sortedBy { it.total }     
} 
数据类MyFilm(val总计:Int):Film{
重写suspend fun total():Int=total
}
suspend fun getFilms():List=withContext(Dispatchers.Default){
电影。按{it.total}分类
} 

该错误明确指出“只能在协同程序体内调用暂停功能”。您正从sortedBy中调用total(),因此出现了错误。 你应该提供更多的上下文,以便我能够提供更准确的答案。有了这样小的上下文,就可以从total()中删除suspend,让代码编译。无论如何,试试这个:

suspend fun getFilms() = films.sortedBy { it.total() }
如果您无法更改接口,那么类似这样的内容会怎么样:

data class MyFilm(val total: Int) : Film {
    override suspend fun total(): Int = total 
}

suspend fun getFilms(): List<Film> = withContext(Dispatchers.Default) {
   films.sortedBy { it.total }     
} 
数据类MyFilm(val总计:Int):Film{
重写suspend fun total():Int=total
}
suspend fun getFilms():List=withContext(Dispatchers.Default){
电影。按{it.total}分类
} 

这不是一个警告,而是一个错误(“暂停函数只能在协同程序主体内调用”),因为协同程序是如何工作的。我无法理解使用runBlocking如何帮助其他人编译代码。该范围应主要用于测试目的。它不是警告,而是错误(“暂停函数只能在协同程序主体内调用”),因为协同程序是如何工作的。我无法理解使用runBlocking如何帮助其他人编译代码。该范围应主要用于测试目的。太棒了!谢谢你真棒!谢谢,谢谢,但这不应该是回答,而应该是评论。@Héctor不完全是。只需删除挂起修饰符即可回答您的问题。另外请注意,接受的答案效率很低(我已经编辑了答案),删除所有代码也可以解决我的问题,但这也不是答案。我有
suspend
修饰符,因为我需要它,所以删除它不是一个选项。你的建议与我的代码有什么不同?(不从
total
方法中删除suspend)它不会改变任何东西,
sortedBy
采用交叉内联lambda,这不会使内部上下文可用。谢谢,但这不应该是一个答案,而应该是一个注释。@Héctor不完全正确。只需删除挂起修饰符即可回答您的问题。另外请注意,接受的答案效率很低(我已经编辑了答案),删除所有代码也可以解决我的问题,但这也不是答案。我有
suspend
修饰符,因为我需要它,所以删除它不是一个选项。你的建议与我的代码有什么不同?(不从
total
方法中删除suspend)它不会更改任何内容,
sortedBy
采用交叉内联lambda,这不会使上下文在内部可用。