【问题标题】:RxJava takeUntil with emmision of last item?RxJava takeUntil 与最后一项的排放?
【发布时间】:2018-05-26 12:17:02
【问题描述】:

是否有可能在takeUntil 运算符中发出满足条件的项目?

【问题讨论】:

  • 有 Observable.last() 和 lastOrDefault() 运算符 - 你可以在 Observable.takeUntil() 之后添加它

标签: java rx-java


【解决方案1】:

嗯,不确定我是否理解您的问题。像这样?

@Test
public void tesTakeUntil() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    Observable.from(numbers)
              .takeUntil(number -> number > 3)
              .subscribe(System.out::println);

}

它会打印出来

 1
 2
 3
 4

您可以在此处查看更多示例 https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/filtering/ObservableTake.java

【讨论】:

  • 假设我有Observable&lt;String&gt;,我有.takeUntil("foo".equals(myString)),我想得到最后一个发出的项目。
  • 然后我会使用 .filter(s->s.equals("foo") 我认为如果你提供你的代码来理解你想要做什么会更好
【解决方案2】:

使用此解决方案,谓词只需调用一次。

final String stop = "c";
Observable.just("a", "b", "c", "d")
          .takeUntil(item -> item.equals(stop))
          .lastElement()
          .subscribe(System.out::println);

输出:

c

【讨论】:

    【解决方案3】:
    final String stop = "c";
    Observable.just("a", "b", "c", "d")
              .filter(item -> !item.equals(stop))
              .takeUntil(item -> item.equals(stop))
              .subscribe(System.out::println);
    

    输出:

    c
    

    【讨论】:

    • 如果我的逻辑真的涉及到我不想重复两次怎么办?
    • 如果你的意思是filter和takeUntil的逻​​辑,那么将它封装在一个布尔方法中并将item传递给它。
    • 但是使用此解决方案,您必须调用该方法两次并完成所有工作两次...
    • 2 个选项:1) 定义一个副作用,如最终的 AtomicBoolean 标志,在 filter() 之前使用 doOnNext() 设置此标志,然后在 filter 和 takeUntil 中获取它; 2) 将布尔标志与项目一起作为一对元组传递。
    猜你喜欢
    • 2015-09-30
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多