Android的 – 是否可以使用Comparator.comparing排序列表,而不是在API <24的自定义比较器?

我在我正在工作的应用程序中有一个RecyclerView,我可以填充各种项目和搜索/筛选/排序/依此类推。 目前正在分拣。

我有多个标准可以排序,可以从下拉菜单中选择。 在数据对象中排序的值包括字符串,整数和枚举,所有这些都很容易分类。 然而,尽管一些分类选项只需要一个标准,但是一些需要二级或三级标准(并且在一些非常罕见的情况下高达4个)。 为了有效地使用Collections.sort(List, Comparator) ,我需要编写相当多的自定义比较器,所以我希望有一些方法可以避免这种情况。

原来,Java 8有一个很好的解决方案: Comparator.comparing(...) ,它为您生成比较器,并可以通过Comparator.comparing().thenComparing().thenComparing()...无限地轻松扩展。 它也有List myList.sort() ,我不知道与Collections.sort(myList)相比的效率,但它感觉更清洁。 我看着它, 只是我的运气! Android已经支持了很多Java 8function,现在已经有一段时间了!

不幸的是,Android Studio告诉我,出于某种原因, Comparator.comparing()以及List::sort只在API 24及更高版本上受支持。 这对我来说并不现实,因为我正在开发的应用程序“需要”的运行速度与API 15-16一样低。 但是,我发现这很奇怪,因为我试过的其他Java 8特性(lambdaexpression式类似于(o1, o2) -> (o1.toString().compareTo(o2.toString())和方法引用(如List::sort上面的List::sort )在我检查的范围内的所有API级别上都可以正常工作,只要您指定了针对Java 8的目标即可。而这毕竟是Java 8的事情,而不是Android的事情。

所以记住,有没有办法使Comparator.comparing()List::sort工作在API 24之下? 我在Google搜索中没有发现任何东西,它们最终都只是指向Android的Java 8“文档”或比较器和列表的JavaDocs。 要么是Android的支持库中的东西(似乎不太可能)或像Retrolambda这样的第三方库/黑客?

尝试streamsupport库移植一些Java 8function到Java 6/7: https : //github.com/streamsupport

他们有你需要的类: https : //github.com/streamsupport/streamsupport/blob/master/src/main/java/java8/util/Comparators.java (它只是为了避免名称冲突从Comparator更名为Comparator ) 。

目前只有一小部分Java8操作完全向后兼容。 https://developer.android.com/studio/write/java8-support.html#supported_features

但是,几乎所有的java8function也可以向后兼容Kotlin。 是使用Kotlin还是RxJava? 他们都支持过滤方法。

如果你有一个列表,你想过滤用户名和电子邮件,那么你可以做类似的事情

科特林:

 list.filter{it.username.contains(filterString)}.filter{it.email.length > 4} 

Rx的工作稍微多一些,因为它在作为实际列表被使用之前必须进行转换,但对于Java或Kotlin来说,使用正确的语法基本上是一样的。