Android flatMapFirst:flatMap,仅当前一个观察值结束时才添加新的观察值

Android flatMapFirst:flatMap,仅当前一个观察值结束时才添加新的观察值,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,如何实现类似于flatMap的flatMapFirst操作符,但仅在前一个操作符结束时添加新的可观察对象?如果前一个仍在运行,它只会忽略新的可观察对象。如何在rxjava2中实现它 它已经存在于培根- 在凯菲尔- 您不需要新的运营商,而是需要现有运营商的组合: source.onBackpressureLatest().flatMap(function, 1) FlatMap将一次运行1个内部源,如果在FlatMap运行1个内部源时没有需求,onBackpressureLatest将继续删除外

如何实现类似于
flatMap
flatMapFirst
操作符,但仅在前一个操作符结束时添加新的可观察对象?如果前一个仍在运行,它只会忽略新的可观察对象。如何在rxjava2中实现它

它已经存在于培根- 在凯菲尔-


您不需要新的运营商,而是需要现有运营商的组合:

source.onBackpressureLatest().flatMap(function, 1)
FlatMap将一次运行1个内部源,如果在FlatMap运行1个内部源时没有需求,onBackpressureLatest将继续删除外部源值(最新值除外)


如果您不想继续从源代码中获得最新的可用性,请考虑使用<代码> OnButlook PraseRead < /COD>。

< P>不需要新的操作符,但现有的组合:

source.onBackpressureLatest().flatMap(function, 1)
FlatMap将一次运行1个内部源,如果在FlatMap运行1个内部源时没有需求,onBackpressureLatest将继续删除外部源值(最新值除外)

如果您不想继续从源代码中获得最新的可用性,请考虑使用<代码> OnButlook PraseRead < /C> >。

后续。如果您想在RxJava 2

中使用
flatMapFirst
,而不是
Flowable
,下面是一个快速的Kotlin实现:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    toFlowable(BackpressureStrategy.DROP)
        .flatMap({ transform(it).toFlowable(BackpressureStrategy.BUFFER) }, 1)
        .toObservable()
fun Observable.flatMapFirst(转换:(T)->Observable)=
toFlowable(背压稳定下降)
.flatMap({transform(it).toFlowable(BackpressureStrategy.BUFFER)},1)
.TooObservable()文件
UPD.基于David Karnok建议的替代实施方案:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    Observable.defer {
        val busy = AtomicBoolean()
        return@defer this
                .filter { busy.compareAndSet(false, true) }
                .flatMap {
                    transform(it).doAfterTerminate { busy.set(false) }
                }
    }
fun Observable.flatMapFirst(转换:(T)->Observable)=
可观察的{
val busy=AtomicBoolean()
return@defer这
.filter{busy.compareAndSet(false,true)}
.平面图{
transform(it).doAfterTerminate{busy.set(false)}
}
}
一项后续行动。如果您想在RxJava 2
中使用
flatMapFirst
,而不是
Flowable
,下面是一个快速的Kotlin实现:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    toFlowable(BackpressureStrategy.DROP)
        .flatMap({ transform(it).toFlowable(BackpressureStrategy.BUFFER) }, 1)
        .toObservable()
fun Observable.flatMapFirst(转换:(T)->Observable)=
toFlowable(背压稳定下降)
.flatMap({transform(it).toFlowable(BackpressureStrategy.BUFFER)},1)
.TooObservable()文件
UPD.基于David Karnok建议的替代实施方案:

fun <T, R> Observable<T>.flatMapFirst(transform: (T) -> Observable<R>) =
    Observable.defer {
        val busy = AtomicBoolean()
        return@defer this
                .filter { busy.compareAndSet(false, true) }
                .flatMap {
                    transform(it).doAfterTerminate { busy.set(false) }
                }
    }
fun Observable.flatMapFirst(转换:(T)->Observable)=
可观察的{
val busy=AtomicBoolean()
return@defer这
.filter{busy.compareAndSet(false,true)}
.平面图{
transform(it).doAfterTerminate{busy.set(false)}
}
}

我成功地解决了这个问题:

/**
 * Flatmaps upstream items into [source] items.
 * Ignores upstream items if there is any [source] instance currently running.
 *
 * ```
 * upstream ----u-----u---u-------u---------------|-->
 *              ↓                 ↓               ↓
 * source       ---s-------|->    ---s-------|->  ↓
 *                 ↓                 ↓            ↓
 * result   -------s-----------------s------------|-->
 * ```
 */
fun <T, R> Observable<T>.flatMapWithDrop(source: Observable<R>): Observable<R> {
  return this.toFlowable(BackpressureStrategy.DROP)
    .flatMap({ source.toFlowable(BackpressureStrategy.MISSING) }, 1)
    .toObservable()
}
/**
*Flatmaps将上游项目映射到[源]项目。
*如果当前正在运行任何[source]实例,则忽略上游项。
*
* ```
*上游----u----u----u----u----u--------->
*              ↓                 ↓               ↓
*来源--s-------->--s-------->↓
*                 ↓                 ↓            ↓
*结果------s-----------s---------------|-->
* ```
*/
有趣的可观察。flatMapWithDrop(来源:Observable):可观察{
返回此.toFlowable(背压等级下降)
.flatMap({source.toFlowable(BackpressureStrategy.MISSING)},1)
.TooObservable()文件
}

我成功地解决了这个问题:

/**
 * Flatmaps upstream items into [source] items.
 * Ignores upstream items if there is any [source] instance currently running.
 *
 * ```
 * upstream ----u-----u---u-------u---------------|-->
 *              ↓                 ↓               ↓
 * source       ---s-------|->    ---s-------|->  ↓
 *                 ↓                 ↓            ↓
 * result   -------s-----------------s------------|-->
 * ```
 */
fun <T, R> Observable<T>.flatMapWithDrop(source: Observable<R>): Observable<R> {
  return this.toFlowable(BackpressureStrategy.DROP)
    .flatMap({ source.toFlowable(BackpressureStrategy.MISSING) }, 1)
    .toObservable()
}
/**
*Flatmaps将上游项目映射到[源]项目。
*如果当前正在运行任何[source]实例,则忽略上游项。
*
* ```
*上游----u----u----u----u----u--------->
*              ↓                 ↓               ↓
*来源--s-------->--s-------->↓
*                 ↓                 ↓            ↓
*结果------s-----------s---------------|-->
* ```
*/
有趣的可观察。flatMapWithDrop(来源:Observable):可观察{
返回此.toFlowable(背压等级下降)
.flatMap({source.toFlowable(BackpressureStrategy.MISSING)},1)
.TooObservable()文件
}

它似乎与onBackpressureDrop()一起工作,而不是与OnBackPressureRelatest()一起工作。onBackpressureDrop()是正确的吗?我将把它更正为onBackpressureDrop(),如果是错误的话,请随意更正它。它们有不同的语义含义:对于
onBackpressureDrop
,如果源代码在突发事件后由于某种原因暂停,您可能会在处理过程中出现间隙。@akarnokd,似乎这只适用于
可流动的
-s。对于
可观察的
,是否有
flatMapFirst
的捷径模拟,而不转换为
可流动的
?否,这是一种通过
可流动的
廉价获得的背压效应。您必须编写一个自定义的
Observable
操作符。它似乎与onBackpressureDrop()而不是onBackpressureLatest()一起工作。onBackpressureDrop()是正确的吗?我将把它更正为onBackpressureDrop(),如果是错误的话,请随意更正它。它们有不同的语义含义:对于
onBackpressureDrop
,如果源代码在突发事件后由于某种原因暂停,您可能会在处理过程中出现间隙。@akarnokd,似乎这只适用于
可流动的
-s。对于
可观察的
,是否有
flatMapFirst
的捷径模拟,而不转换为
可流动的
?否,这是一种通过
可流动的
廉价获得的背压效应。您必须编写一个自定义的
可观察的
操作符。BackpressureStrategy.MISSING是错误的策略。您需要应用
onbackpressurexx
运算符,否则flatMap很可能会溢出其内部队列。@akarnokd,据我所知
。BUFFER
相当于SpscLinkedArrayQueue在hoo下的行为