首页 > 解决方案 > 如何结合两个可流动并仅获得相同的排放值?

问题描述

        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")

标签: kotlinrx-javarx-java2

解决方案


您可以使用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;
}

推荐阅读