Android RxJava 按其参数排序对象,该参数是另一个对象的列表

Posted

技术标签:

【中文标题】Android RxJava 按其参数排序对象,该参数是另一个对象的列表【英文标题】:Android RxJava sort object by its parameter which is list of another object 【发布时间】:2021-09-13 07:47:46 【问题描述】:

我有一个对象

data class Question(
    var publishDate: DateTime?,
    var tags: List<QuestionTags>
    etc.

现在它按发布日期排序 val sortedQuestions = questions.sortedBy it.publishDate

但我想按其标签chapterId 之一对其进行排序。 QuestionTags 看起来像这样

data class QuestionTags(
    val id: Long,
    val chapterId: Long?
    etc.

我试图做一些 RxJava 魔法

sortedQuestions = 
   questions.flatMap  it.tags 
      .filter  it.chapterId != null 
      .map  sortedQuestions[0] 
      .sortedBy  it.blablabla 

但无论如何它都不起作用。

如何.map 它或.flatMap 它来实现它?

我试图将其平面映射到 QuestionTags,而不是将其映射到 Question

sortedQuestions =
   questions.flatMap  it.tags 
   .filter  it.chapterId != null 
   .map  Question() 

但在.map Question() 中,它强制我将值传递给所有构造函数参数,这是我不想做的。

【问题讨论】:

既然你有一个List&lt;QuestionTags&gt;,如果一个问题的标签带有chapterId 1 和3,而另一个带有2 的标签会发生什么:稍后应该对哪个问题进行排序?如果一个有 1、2、3 和另一个 1,2 怎么办? 它应该按列表中的第一个chapterId排序。如果两者都有相同的chapterId,它们应该按publishDate 排序,就像已经完成一样。 【参考方案1】:

它应该按列表中的第一个 chapterId 排序。如果两者都有相同的chapterId,它们应该按publishDate排序,就像它已经完成一样

那么你根本不需要flatMap(或RxJava):

questions.sortedBy  Pair(it.tags.firstOrNull(), it.publishDate) 

【讨论】:

以上是关于Android RxJava 按其参数排序对象,该参数是另一个对象的列表的主要内容,如果未能解决你的问题,请参考以下文章

Android:rxjava简单实现原理(create操作符)

RxJava 在Android中的应用

Android rxjava和LiveData中的内存泄漏

RxJava在Android中内存泄漏解决以及RxJava的封装

查找按其关系的聚合属性排序的实体

打印按其键排序的字典项目[重复]