【问题标题】:How to combine two flowable and get only same emission values?如何结合两个可流动并仅获得相同的排放值?
【发布时间】:2021-05-07 19:26:27
【问题描述】:
        val flowable01 = Flowable.fromArray(listOf(
            Value(epoch = 1,string ="apple"),
            Value(epoch = 2,string ="apple"), 
            Value(epoch = 3,string ="apple"),
            Value(epoch = 4,string ="apple"), 
            Value(epoch = 5,string ="apple"),
            Value(epoch = 6,string ="apple"), 
            Value(epoch = 7,string ="apple"),
            Value(epoch = 8,string ="apple"), 
            Value(epoch = 9,string ="apple"),
            Value(epoch = 10,string ="apple"), 
            ))
        val flowable02 = Flowable.fromArray(listOf(
            Value(epoch = 2,string ="orange"), 
            Value(epoch = 3,string ="orange"),
            Value(epoch = 5,string ="orange"),
            Value(epoch = 8,string ="orange"), 
            Value(epoch = 10,string ="orange"), 
            ))
            
        flowable01.filter { it.epoch == flowable02.emission.epoch }
                  .map { Value(it.epoch, "juice") }
    

如何组合两个可流动的并仅从排放中过滤出相同的值并将其映射到另一个数据类? 也许使用 combineLatest/zip

//Result:  
Value(epoch = 2,string ="juice")
Value(epoch = 3,string ="juice")
Value(epoch = 5,string ="juice")
Value(epoch = 8,string ="juice")
Value(epoch = 10,string ="juice")

【问题讨论】:

  • 数字是否按升序排列?一个序列总是另一个序列的子集吗?数字可以重复吗?
  • 纪元(时间)中的数字,按递增顺序排列,不重复。是的,第二个流动是第一个的子集。 @Progman
  • 在这个例子中是的,但是它在数据类中,我需要他们两个的值来创建另一个数据类)
  • edit您的问题表明您的实际情况以及您正在尝试做什么。您在评论中描述的问题与您在问题中描述的问题不同。
  • 已编辑,这正是我想要的

标签: kotlin rx-java rx-java2


【解决方案1】:

你可以使用flatMap:

flowable01.flatMap { first ->
  flowable02.filter { second -> first.epoch == second.epoch }
  .map { second -> Value(second.epoch, "Juice") }
}

如果 flowable02 是外部数据源,您可能不希望每次都重新查询它,以便预先将其缓存:

flowable02cache = flowable02.cache()

flowable01.flatMap { first ->
  flowable02cache.filter { second -> first.epoch == second.epoch }
  .map { second -> Value(second.epoch, "Juice") }
}

如果您想利用每个源中的排序,则合并步骤会更复杂:

Single.zip(flowable01.toList(), flowable02.toList()) { first, second ->

    val result = ArrayList<Value>()

    var i = 0;
    var j = 0;
    while (i < first.length && j < second.length) {
        if (first[i].epoch == second[j].epoch) {
            result.add(Value(first[i].epoch, "Juice"))
            i++;
            j++;
        }
        if (first[i].epoch < second[j].epoch) {
            i++;
        }
        if (first[i].epoch > second[j].epoch) {
            j++;
        }
    }

    result;
}

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2022-11-18
    • 2015-11-26
    • 2021-05-20
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多