Android - 是否可以使用Comparator.comparing而不是API <24上的自定义Comparators对列表进行排序?

Ver*_*mCH 11 java sorting android comparator java-8

我在我正在开发的应用程序中有一个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())像List::sort上面的lambda表达式和方法引用一样)在我检查的范围内的所有API级别上工作正常,只要您指定定位Java 8.毕竟它是Java 8的东西,而不是Android的东西.

因此,考虑到所有这些,有没有办法在API 24下制作Comparator.comparing()和List::sort工作?我在谷歌的搜索中没有找到任何东西,它们最终只是指向Android的Java 8"文档"或JavaDocs for Comparator和List.Android的支持库(似乎不太可能)或第三方库/像Retrolambda这样的东西?

Ant*_*hev 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.我想你也应该提一下[android-retrostreams](https://github.com/retrostreams/android-retrostreams).对于使用Android Studio 3.x的开发人员来说,这甚至更好.例如,功能接口具有真正的Java 8**默认**和**静态**方法.对于Java 8 Stream API中添加的所有其他接口也是如此. (6认同)
  • 这正是我所希望的!根据@Sartorius的建议,我使用了android-retrostreams.功能强大且易于与Android Studio 3+集成. (4认同)