Android - 是否可以在小于 24 的 API 上使用 Comparator.comparing 而不是自定义比较器对列表进行排序?
Android - Is it possible to sort lists using Comparator.comparing instead of custom Comparators on APIs < 24?
我正在开发的应用程序中有一个 RecyclerView,我可以填充各种项目并 search/filter/sort/so 打开。目前正在整理。
我有多个排序标准,可以从下拉微调器中选择。数据对象中排序的值包括字符串、整数和枚举,所有这些都非常容易排序。然而,虽然一些排序选项只需要一个标准,但有些需要二级或三级标准(在极少数情况下最多需要 4 个)。为了有效地使用 Collections.sort(List, Comparator)
,我必须编写大量的自定义比较器,所以我希望有一些方法可以避免这种情况。
事实证明,Java 8 有一个很好的解决方案:Comparator.comparing(...)
,它会为您生成比较器,并且可以通过 Comparator.comparing().thenComparing().thenComparing()...
轻松无限地扩展。它还具有 List myList.sort()
,与 Collections.sort(myList)
相比,我不确定效率如何,但对我来说感觉更干净。我调查了一下,觉得 真幸运! Android 一段时间以来一直支持许多 Java 8 项功能!
不幸的是,Android Studio 告诉我,出于某种原因,Comparator.comparing()
和 List::sort
仅在 API 24 及更高版本上受支持。这对我来说实际上行不通,因为我正在开发的应用程序 "needs to" 运行 低至 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 以下工作?我在 Google 搜索中没有找到任何内容,它们最终都指向 Android 的 Java 8 "documentation" 或 Java 比较器文档和列表。 Android 的支持库之一(似乎不太可能)或第三方 library/hack,如 Retrolambda?
目前只有 Java8 操作的一小部分在 Android 上完全向后兼容。
https://developer.android.com/studio/write/java8-support.html#supported_features
您可以获得几乎所有 java8 功能,但这些功能也向后兼容 Kotlin。使用 Kotlin 或 RxJava 是一种选择吗?它们都支持过滤方法。
如果你有一个列表并且你想过滤用户名和电子邮件,你可以做类似的事情
科特林:
list.filter{it.username.contains(filterString)}.filter{it.email.length > 4}
Rx 稍微多一些工作,因为它必须在作为实际列表使用之前进行转换,但对于 Java 或 Kotlin 来说,如果使用正确的语法,它本质上是一样的。
尝试将一些 java 8 功能移植到 java 6/7 的 streamsupport 库:
https://github.com/streamsupport
他们有您需要的class:
https://github.com/streamsupport/streamsupport/blob/master/src/main/java/java8/util/Comparators.java
(它从 Comparator
重命名为 Comparators
只是为了避免名称冲突)。
我正在开发的应用程序中有一个 RecyclerView,我可以填充各种项目并 search/filter/sort/so 打开。目前正在整理。
我有多个排序标准,可以从下拉微调器中选择。数据对象中排序的值包括字符串、整数和枚举,所有这些都非常容易排序。然而,虽然一些排序选项只需要一个标准,但有些需要二级或三级标准(在极少数情况下最多需要 4 个)。为了有效地使用 Collections.sort(List, Comparator)
,我必须编写大量的自定义比较器,所以我希望有一些方法可以避免这种情况。
事实证明,Java 8 有一个很好的解决方案:Comparator.comparing(...)
,它会为您生成比较器,并且可以通过 Comparator.comparing().thenComparing().thenComparing()...
轻松无限地扩展。它还具有 List myList.sort()
,与 Collections.sort(myList)
相比,我不确定效率如何,但对我来说感觉更干净。我调查了一下,觉得 真幸运! Android 一段时间以来一直支持许多 Java 8 项功能!
不幸的是,Android Studio 告诉我,出于某种原因,Comparator.comparing()
和 List::sort
仅在 API 24 及更高版本上受支持。这对我来说实际上行不通,因为我正在开发的应用程序 "needs to" 运行 低至 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 以下工作?我在 Google 搜索中没有找到任何内容,它们最终都指向 Android 的 Java 8 "documentation" 或 Java 比较器文档和列表。 Android 的支持库之一(似乎不太可能)或第三方 library/hack,如 Retrolambda?
目前只有 Java8 操作的一小部分在 Android 上完全向后兼容。 https://developer.android.com/studio/write/java8-support.html#supported_features
您可以获得几乎所有 java8 功能,但这些功能也向后兼容 Kotlin。使用 Kotlin 或 RxJava 是一种选择吗?它们都支持过滤方法。
如果你有一个列表并且你想过滤用户名和电子邮件,你可以做类似的事情
科特林:
list.filter{it.username.contains(filterString)}.filter{it.email.length > 4}
Rx 稍微多一些工作,因为它必须在作为实际列表使用之前进行转换,但对于 Java 或 Kotlin 来说,如果使用正确的语法,它本质上是一样的。
尝试将一些 java 8 功能移植到 java 6/7 的 streamsupport 库: https://github.com/streamsupport
他们有您需要的class:
https://github.com/streamsupport/streamsupport/blob/master/src/main/java/java8/util/Comparators.java
(它从 Comparator
重命名为 Comparators
只是为了避免名称冲突)。