当前位置: 首页 > 知识库问答 >
问题:

从过滤序列中获得最后一个未过滤结果的惯用方法是什么?

李良策
2023-03-14
        class SimpleWrapper<T> {
        private T data;

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }
    }

    SimpleWrapper<String> state = new SimpleWrapper<>();

    Observable<Response> getLogObservable = Observable.interval(checkInterval, TimeUnit.SECONDS)
            .take(checkCount)
            .flatMap(ignored -> api.check())
            .doOnNext(response -> {
                logger.info("Check response: {}", response.getMessage());
                state.setData(response.getMessage());
            })
            .firstOrDefault(null, HubLogsApiResponse::isSuccess)
            .flatMap(response -> {
                if (response == null) {
                    return Observable.error(new RuntimeException(String.format("Last call to check was unsuccessful: %s", state.getData())));
                } else {
                    return Observable.just(response);
                }
            })

这是丑陋的,需要我使用副作用,但我不知道如何才能实现这一点。

有什么建议吗?

共有1个答案

苏高远
2023-03-14

问题:发出一系列请求,或者返回成功的第一个请求,或者返回错误的最后一个请求。

如果我们引入一个,就可以将interval产生的计数与API请求结合起来。然后,不需要设置全局变量就可以检查终止条件。

Observable<Response> getLogObservable = 
  Observable.interval(checkInterval, TimeUnit.SECONDS)
        .flatMap(requestNumber -> api.check()
                                    .map(response -> 
                                         new Pair(requestNumber+1, response))
        .flatMap(pair -> mapResponse( pair ) )
        .take( 1 );

Observable<Response> mapResponse( Pair<Long, Response> response ) {
  if ( response.getSecond().isSuccess() ) {
    return Observable.just( response.getSecond() );
  }
  if ( response.getFirst() >= checkCount ) {
    Observable.error(
      new RuntimeException(String.format("Last call to check was unsuccessful: %s", 
            pair.getSecond().getData())));
  }
  return Observable.empty();
}

mapresponse仅在计数器运行其过程时才生成包含最新响应的错误。否则,它返回一个成功的响应或一个空的Observable。

 类似资料:
  • 我一直在玩Java 8 ,我决定对 和 流进行微基准测试。正如预期的那样, 的速度是原来的两倍,但还是出现了其他一些问题--如果我在将数据传递给 之前先对其进行排序,则与传递未排序列表相比, Map->Collect/code>得到结果所需的时间要多出5-8倍。 下面是一个更好的基准测试代码 结果也是相似的: 那么,我的问题是为什么过滤一个未排序的列表比过滤一个已排序的列表更快呢?

  • 问题内容: 我想过滤java.util.Collection基于谓词的。 问题答案: Java 8(2014)在一行代码中使用流和lambda解决了此问题: 这是一个教程。 使用修改收集到位。(注意:在这种情况下,谓词将删除满足该谓词的对象): 允许过滤集合而无需编写循环或内部类: 你能想象一些更具可读性的东西吗?

  • 我尝试根据过滤最后一个元素的过滤器引发异常: 这样我就可以分辨出为什么在人流中没有发现任何人。是因为年龄还是因为没有人养宠物。 我只看到一个选项,并用两个流来实现它? 或者我能做些什么来把所有的事情都集中在一个流里?

  • RxJava让我们使用filter()方法来过滤我们观测序列中不想要的值,在上一章中,我们在几个例子中使用了已安装的应用列表,但是我们只想展示以字母C开头的已安装的应用该怎么办呢?在这个新的例子中,我们将使用同样的列表,但是我们会过滤它,通过把合适的谓词传给filter()函数来得到我们想要的值。 上一章中loadList()函数可以改成这样: private void loadList(List

  • 问题内容: 我有一个过滤器linkifyStuff,其中需要使用其他过滤器处理一些变量。我无法弄清楚从另一个调用一个过滤器的语法。 我了解过滤器链接-这不是我想要的。我想将过滤器应用于linkifyStuff过滤器中的局部变量,而不是其输入或输出。 我希望像下面这样工作,但是$ filter(’filtername’)显然不是正确的语法。 我可以为sanitizeStuff和sanitizeStu

  • 有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性。例如: <li v-for="n in evenNumbers">{{ n }}</li> data: { numbers: [ 1, 2, 3, 4, 5 ] }, computed: { evenNumbers: function () { retu