sty*_*972 0 java collections android exception kotlin
我正在使用Collections.sort()对列表进行排序,这似乎在我测试它的所有方式中都可以正常工作。我的一些用户崩溃了。
Caused by java.lang.UnsupportedOperationException
java.util.AbstractList.set (AbstractList.java:681)
java.util.AbstractList$FullListIterator.set (AbstractList.java:143)
java.util.Collections.sort (Collections.java:1909)
com.myapp.MyFragment.myMethod (MyFragment.java:225)
Run Code Online (Sandbox Code Playgroud)
但是,我正在做的就是尝试对列表进行排序
private void myMethod(List<MyThing> myThings) {
Collections.sort(myList, (thing1, thing2) -> Long.compare(thing2.getLongValue(), thing1.getLongValue()));
Run Code Online (Sandbox Code Playgroud)
我注意到这在Android 8及更高版本上不会发生。它仅发生在5.0-7.1
该列表被实例化为ArrayList,进行填充,并设置为作为通用列表的类的实例的成员。然后将该对象与EventBus一起发布。然后使用Kotlin map和sortedByDescending函数映射并排序列表。然后将映射和排序的列表传递给myMethod()
这个Kotlin扩展正在生成传递给此方法的列表:
fun List<MyThing>.mapAndSort(context: Context): List<MyThing> {
return mapNotNull {
when (it.type) {
type -> it.getTyped(context) //all of these return polymorphic MyThings
anotherType -> it.getAnotherTyped(context)
someOtherType -> it.getSomeOtherTyped(context)
yetAnotherType -> it.getYetAnotherType(context)
yetOneMoreType -> it.getYetOneMoreType(context)
finallyLastTyope -> it.getFinallyLastType(context)
else -> null
}
}.sortedByDescending { it.longValue }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经看到此列表是java.util.Arrays$ArrayList和kotlin.collections.EmptyList。
我认为这与EventBus有关,但可能是Kotlin传递了Kotlin收藏夹列表类型。有人知道到底发生了什么吗?
Collections.sort是就地列表变异操作。如果要在Java方法中调用它,请仅在静态传递的MutableListKotlin中传递一个列表。
如果您具有List未知的可变性,则可以MutableList通过.toMutableList()在其上调用扩展功能来从中获得一个。
而且,如果不是myMethod用Java编写对list.sortedByDescending { it.longValue }您而言并不重要,则可以用Kotlin中的call 代替它,那么您无需先将该列表转换为可变列表。实际上,这就是mapAndSort方法的最终目的,因此看起来无需再次对其进行排序。
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |