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

在条件之后返回通量或错误

孟华晖
2023-03-14

我正在学习webflux的反应式编程,为此我迁移了一些代码。

例如,我试图迁移此方法:

public Set<Vaccine> getAll(Set<Long> vaccinesIds) throws EntityNotFoundException {
        if (null == vaccinesIds) {
            return null;
        }

        Set<Long> vaccinesToFind = new HashSet<>(vaccinesIds);
        vaccinesToFind.remove(null);

        Set<Vaccine> vaccines = new HashSet<>();
        vaccineRepository.findByIdIn(vaccinesToFind).forEach(vaccines::add);

        if (vaccines.size() != vaccinesToFind.size()) {
            LOG.warn("Could not find vaccines with ids: " + vaccinesToFind.removeAll(vaccines.stream().map(Vaccine::getId).collect(Collectors.toSet())));
            throw new EntityNotFoundException(VACCINE_ERROR_NOT_FOUND);
        }

        return vaccines;
    }

总结代码,如果respository返回所有请求的疫苗,则应返回结果,否则应返回错误。

为此,我这样想,但不起作用:

public Flux<Vaccine> getAll(Set<Long> vaccinesIds) {
    if (null == vaccinesIds) {
        return Flux.empty();
    }

    Set<Long> vaccinesToFind = new HashSet<>(vaccinesIds);

    Flux<Vaccine> byIdIn = vaccineRepository.findByIdIn(vaccinesToFind);
        
    Mono<Long> filter = vaccineRepository.findByIdIn(vaccinesToFind).count().filter(x -> x.equals(Long.valueOf(vaccinesToFind.size())));

   return filter.flatMapMany(asd -> vaccineRepository.findByIdIn(vaccinesToFind)
    ).switchIfEmpty(Flux.error((new EntityNotFoundException(VACCINE_ERROR_NOT_FOUND))));
   
}

我做错了什么?

我的第一个疑问是,如果过滤器最后有一个equals方法,为什么它是一个Long的Mono。我的问题是评估过滤器以返回列表或错误。

共有1个答案

怀飞扬
2023-03-14

首先,您正在多次查询相同的结果疫苗epository.findByIdIn(疫苗查找)。相同的数据被多次查询、传输和反序列化。这是这里出问题的迹象。

让我们假设结果集适合内存。然后想法是将通量转换为通常的集合,并决定是否发出错误:

return vaccineRepository.findByIdIn(vaccinesIds)
.collectList()
.flatMapMany(result -> {
    if(result.size() == vaccinesIds.size()) return Flux.fromIterable(result);
    else return Flux.error(new EntityNotFoundException(VACCINE_ERROR_NOT_FOUND));
});

如果结果对于主内存来说太大,您可以通过第一次查询在数据库中进行计数,在肯定的情况下查询结果。解决方案与您的代码类似:

return vaccineRepository.countByIdIn(vaccinesIds)
.filter(count -> count == vaccinesIds.size())
.flatMapMany($ -> vaccineRepository.findByIdIn(vaccinesIds))
.switchIfEmpty(Mono.error(new EntityNotFoundException(VACCINE_ERROR_NOT_FOUND)));

filter的结果是Mono

 类似资料:
  • 这是样板代码:我想做这样的事情- 因此,当method1返回空的Object1时。id(),则只调用method2。否则返回空流量。 需要注意的指针是- > 没有到达第二个方法调用 因为一个方法是Mono,另一个是Flux,所以如果我直接在第2行中添加返回,就会出现类型不匹配。 我尝试了方法1: 在上面的代码片段中: 这里从不例外。

  • 问题内容: 这有效: 这不起作用: 为什么第二个不起作用!?我要一线。除此以外,第一个将调用函数TWICE。 如何在不调用函数两次的情况下使其成为1个衬板? 问题答案: 我看到其他人已经指出了我的旧“分配和设置”食谱,该食谱的最简单版本归结为: 但是,这主要是为了简化Python和直接在或中支持赋值的语言之间的音译。如果你有在级联这种检查和回报“数百名”,这是 多 好做一些完全不同的: 甚至像 如

  • 问题内容: 我是Java多线程的新手。我已经进行了一些研究,阅读了教程并进行了测试,但是我仍然遇到这个问题。基本上,我正在设置游戏的骨架,我想拥有一个主要的活动类,一个包含方法的线程类,执行各种慢速操作(读取文件并将内容解压缩到缓冲区),并具有一个线程是游戏循环对UI操作的反应。 首先,我有main活动类,该类实例化并启动一个单独的线程: 然后,我有了实现游戏逻辑线程的类: 最后,线程类(其中包含

  • 我想根据条件返回一个流的值。仅以下面的例子为例,我想将任何苹果映射到< code >食物。苹果公司: 如何在流中包含三元条件?

  • 问题内容: 当我在Go中编写函数时,它应该返回一个值和一个错误,例如 我想在goroutine中执行此createHashedPassword,我想通过通道传递数据。 但是我的问题是,如何在此处或goroutine中处理错误? 问题答案: 通常将多个输出捆绑到一个结构中,然后通过一个通道将它们一起返回。

  • 问题内容: 我需要创建一个 Java 方法以返回或随机返回。我怎样才能做到这一点? 问题答案: 该类已经具有此功能: 但是,每次需要随机布尔值时始终创建一个新实例并不高效。相反,请在您的类中创建需要随机布尔值的type属性,然后为每个新的随机布尔值使用该实例: