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,这不会使上下文在内部可用。