Java 返回在特定条件下首先执行的 Future,或者同时处理两者

2023-11-30

我有两个 API,它们返回两个不同的结果类。我们将这两个结果结合起来得到一个 FinalClass。

基本上,如果这些Api同时运行,

  1. 如果它首先收到具有特定结果(G,H)的A类,则B类是什么并不重要(我们不会等待serviceAPI B),只需返回下表中的Final类。

  2. 如果 A 类没有确定的结果,我们必须等待合并两个结果(A 和 B)才能得到 Final 类。

我正在尝试使用这些 stackoverflow 文章来处理这个问题。我不喜欢用接口标记类来标记它们(这些是遗留对象),但是将其作为第二个选项开放。

返回在响应的特定条件下首先执行的 future

在java中,我如何处理CompletableFutures并获得第一个完成的期望结果?

public class A {
   public String resultA;
}

public class B {
   public int resultB;
}

public class Final {
   public String resultFinal;
}

CompletableFuture<A> futureA = CompletableFuture.supplyAsync(() -> serviceA.getAPI());
CompletableFuture<B> futureB = CompletableFuture.supplyAsync(() -> serviceB.getAPI());

CompletableFuture.allOf(futureA,futureB).join(); 

enter image description here

愿意将这两个类都设为标记接口

public class A implements MarkerResponse  {
public class B implements MarkerResponse  {

public interface MarkerResponse  {}

标记接口

目前使用 Spring Boot 和 Java 8。上下文:真正的服务双 API 可能会变化 1-5 分钟,因此如果可能的话尝试提高性能。


由于在任何一种情况下都需要 A 的结果,为了确定是否需要 B 的结果,您可以简单地将决策链接为 A 上的依赖操作:

CompletableFuture<Final> result = futureA.thenCompose(a ->
    a.resultA.equals("G") || a.resultA.equals("H")?
        CompletableFuture.completedFuture(new Final("success")):
    futureB.thenApply(b -> new Final(b.resultB == 1? "fail": "error")));

请注意,当成功的可能性很大并且并行运行 A 和 B 的收益相当低时,您甚至可以决定仅在必要时才开始 B:

CompletableFuture<Final> result = futureA.thenCompose(a ->
    a.resultA.equals("G") || a.resultA.equals("H")?
        CompletableFuture.completedFuture(new Final("success")):
        CompletableFuture.supplyAsync(
            () -> new Final(serviceB.getAPI().resultB == 1? "fail": "error")));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 返回在特定条件下首先执行的 Future,或者同时处理两者 的相关文章

随机推荐

  • 在运行时更改谷歌地图 v3 中的光标

    The draggableCursor可以在创建时在 google maps Map 对象中设置选项 有什么方法可以在运行时设置此选项吗 或者还有其他干净的方法如何在运行时更改光标 我已经搜索过文档但没有什么比setDraggableCur
  • 使用 Google Cloud Storage 的 Apache Drill

    Apache Drill 功能列表提到它可以从 Google Cloud Storage 查询数据 但我找不到任何有关如何执行此操作的信息 我已经让它在 S3 上工作得很好 但我怀疑我在 Google 云存储方面错过了一些非常简单的东西 有
  • 在android studio上设置flutter错误

    为 android studio 设置 flutter 时出错 我试过 重复这个过程 删除android studio并重新启动 创建项目时出错 无法在 Flutter SDK Target 目录中创建项目 C src flutter pa
  • Facebook 使用 C# 使用 Graph API 检索数据

    我使用 c net 创建了桌面 Facebook 应用程序 我想检索用户的消息 帖子和聊天记录 这是检索用户所有信息的便捷方法 我已经开始使用 Facebook Graph API 但我没有得到任何示例 谁能帮我 聚会有点晚了 但无论如何
  • codeigniter - APPPATH 在控制器之后返回路径

    我在整理应用程序中的路径时遇到问题 我正在使用 APPPATH 函数在数据库中读取 写入图像的字符串路径 问题是 APPPATH 将函数放在控制器之后 这是我获取 css 的函数 当我去http localhost project inde
  • 使用 Process.Start() 时 Windows 窗体 MouseUp 触发两次

    在我的 Windows 窗体应用程序中 如果单击其中一项 我必须打开一个包含特定文件夹的新资源管理器窗口 我正在监听 MouseUp 事件 因为我已经有一些点击检测 我需要点击坐标 现在如果我打开一个新的资源管理器窗口 private vo
  • Paho Mqtt Android 连接到代理失败,并显示 (32103)

    我的网络中有一个 ActiveMQ 代理正在监听 1883 mqtt 如果我使用简单的 Java 应用程序和 mqtt client 0 4 0 jar 库连接到该代理 则一切正常 现在我想使用 Android 设备连接到该经纪人 不幸的是
  • 在 R Shiny 应用程序中渲染 R Markdown 文档时参考书目不起作用

    Problem 我正在尝试在 Shiny 应用程序中渲染 R Markdown 文档 我已经使用 David 在这篇文章中非常有用的解决方案成功实现了这一点 Shiny 应用程序中的 RMarkdown 但是 我无法使用 bib 文件中的引
  • function(e){e.something...} e 是什么?

    当我写作时 new lang click function e alert something e stopPropagation What is e在这里 为什么没有它该功能就无法工作 为什么我可以写任何东西而不是e e is the 事
  • 在模块中使用闪亮的 i18n 翻译闪亮的应用程序?

    Problem 我想将模块化闪亮应用程序的部分内容翻译成德语或英语 我想使用的包是shiny i18n这似乎适用于非模块化应用程序 并且似乎很容易处理 然而 在下面的模块化闪亮玩具示例中 翻译不起作用 有什么建议为什么会发生这种情况吗 服务
  • Nodejs - net 或 http 模块

    我正在做聊天系统nodejs 要创建节点服务器 我可以使用net or http模块 那么使用它们的区别和好处是什么 http是建立在net 它处理 HTTP 底层的 TCP 层 我想你的 聊天系统 将有基于浏览器的客户端 因为 Node
  • 如何等待非子进程退出

    对于子进程 wait and waitpid 函数可用于暂停当前进程的执行 直到子进程退出 但该函数不能用于非子进程 是否还有另一个函数可以等待任何进程的退出 没有什么相当于wait 通常的做法是使用轮询kill pid 0 并寻找返回值
  • 是否可以让 C++ 方法接受 const char* 和 const wchar_t* 作为参数而不重载该方法?

    UPDATE 我选择了模板方法 因为它看起来最优雅 简洁 但最终我得到了这样的东西 template
  • 将 RData 文件读入 Shiny 应用程序

    我正在开发一个闪亮的应用程序 它将读取一些 RData 文件并显示包含内容的表格 这些文件由脚本生成 最终将数据转换为数据帧 然后使用 save 函数保存它们 在闪亮的应用程序中 我有三个文件 ui R server R 和 global
  • 如何只显示角边框?

    我想知道是否可以在 CSS 中制作边框 但仅限于角 像这样的事情 CONTENT 您可以使用多个线性渐变作为背景图像来实现这一点 div width 100px height 100px background linea
  • 是否可以检查用户何时下载我的 ios 应用程序? [复制]

    这个问题在这里已经有答案了 是否可以检查用户何时下载了我的 iOs 应用程序 如果可以 是否可以从中创建一个 if 语句 例如 if downloadDate gt 1march 抱歉 如果您认为这个问题很糟糕 任何代码将不胜感激 D 还应
  • C# Process.Start 参数被截断

    当传递很长的文件路径时 我的参数被截断 我需要启动一个程序并通过命令参数传递所有内容 有时它只是截断命令 它是在全局范围内进行的 因此这不仅是每个参数的问题 而且是整个参数的问题 编辑 问题可能是命令行长度的限制monkey p说 问题是
  • 通过 C 代码计算 Minix 系统上正在运行的进程数

    所以 一开始这看起来很简单 但是在爬行谷歌和这里之后 答案似乎并不像我最初想象的那么简单 基本上 我正在编辑一个 MINIX 内核 作为我的操作系统课程实践的一部分 并且我必须添加一个小功能 当您在信息服务器中按下功能键时 它会显示正在运行
  • 将数据框转换为命名向量

    我在我的 dfm 上应用了一个模型 wordscore 结果我得到了一个输出对象 其类是 textmodel wordscores textmodel list 我对输出 wordscores 感兴趣 它是一个 数字 对象 这就是当clas
  • Java 返回在特定条件下首先执行的 Future,或者同时处理两者

    我有两个 API 它们返回两个不同的结果类 我们将这两个结果结合起来得到一个 FinalClass 基本上 如果这些Api同时运行 如果它首先收到具有特定结果 G H 的A类 则B类是什么并不重要 我们不会等待serviceAPI B 只需