我正在使用的应用程序中有一个RecyclerView,我可以填充各种项目并搜索/过滤/排序等等。目前正致力于排序。
我有多个可以排序的标准,可以从下拉式微调器中选择。在数据对象中排序的值包括字符串,整数和枚举,所有这些都很容易排序。然而,虽然一些排序选项只需要一个标准,但有些标准需要二级或三级标准(在一些极少数情况下最多需要4个标准)。为了有效地使用Collections.sort(List, Comparator)
,我必须编写相当多的自定义比较器,所以我希望有一些方法可以避免这种情况。
事实证明,Java 8有一个很好的解决方案:Comparator.comparing(...)
,可以为您生成Comparators,并且可以通过Comparator.comparing().thenComparing().thenComparing()...
无限期地扩展。它也有List myList.sort()
,我不确定效率与Collections.sort(myList)
相比,但对我来说感觉更清洁。我调查了一下,并认为只是我的运气! Android已经支持许多Java 8功能了一段时间了!
不幸的是,Android Studio告诉我,出于某种原因,Comparator.comparing()
以及List::sort
仅在API 24及更高版本上受支持。这对我来说实际上不起作用,因为我正在研究的应用程序“需要”运行低至API 15-16。但是,我觉得这很奇怪,因为我尝试过的其他Java 8功能(像(o1, o2) -> (o1.toString().compareTo(o2.toString())
这样的lambda表达式和上面的List::sort
等方法引用)在我检查过的范围内的所有API级别都能正常工作只要您指定目标Java 8.毕竟它是Java 8的东西,而不是Android的东西。
考虑到所有这些,有没有办法让Comparator.comparing()
和List::sort
在API 24下工作?我在谷歌的搜索中没有找到任何东西,它们最终只是指向Android的Java 8“文档”或JavaDocs for Comparator和List。 Android的支持库(似乎不太可能)或第三方库/ hack(例如Retrolambda)中的某些内容?
答案 0 :(得分:7)
尝试使用streamsupport库将一些java 8特性移植到java 6/7: https://github.com/streamsupport
他们有你需要的课程:
https://github.com/streamsupport/streamsupport/blob/master/src/main/java/java8/util/Comparators.java
(它已从Comparator
重命名为Comparators
,仅用于避免名称冲突。
答案 1 :(得分:2)
目前,只有一小部分Java8操作完全可以在Android上兼容。 https://developer.android.com/studio/write/java8-support.html#supported_features
然而,您可以获得几乎所有与Kotlin兼容的java8功能。使用Kotlin或RxJava是一种选择吗?他们都支持过滤方法。
如果您有一个列表并且想要过滤用户名和电子邮件,那么您可以执行类似
的操作科特林:
list.filter{it.username.contains(filterString)}.filter{it.email.length > 4}
Rx稍微多一些工作,因为它必须在被作为实际列表使用之前进行转换,但对于Java或Kotlin的正确语法来说它本质上是相同的。