先发帖

通常,我们编写代码来计算出一堆可用的答案。 让我们看看Java中的情况。

 public Widget getAppropriateWidget(CustomerRequest request) { if (shelfstock.contains(request.getBarcode()) { return new ShelfWidget(); } if (backroomStock.contains(request.getBarcode()) { return new BackroomWidget(); } if (supplier.contains(request.getEan()) { return new SupplierWidget(); } return null ;  } 

您将不得不想象更复杂的场景,隐藏在上面的简化代码后面。 该算法的作用是按优先级顺序尝试选项,直到找到有效的选项,否则将失败,在这种情况下它将不返回任何内容。

我们还要想象一下,由于某些原因,对contains的调用很昂贵–也许每个对象都隐藏了一个Web服务或复杂的数据库查询。

让我们以两种方式重构上面的代码开始。 让我们使用Optional ,并为每个方法使用子例程。

 public Optional<Widget> getAppropriateWidget(CustomerRequest request) { Optional<Widget> shelfWidget = getShelfWidget(request); if (shelfWidget.isPresent()) { return shelfWidget; } Optional<Widget> backroomWidget = getBackroomWidget(request); if (backroomWidget.isPresent()) { return backroomWidget; } Optional<Widget> supplierWidget = getSupplierWidget(request); if (supplierWidget.isPresent()) { return supplierWidget; } return Optional.empty;  }  // imagine the subsidiary functions 

因此,这比未找到的返回null要好于null ,并且正努力使用子例程来使该函数描述自身,但是存在这样一个问题,即返回的每个Optional对象都无法链接到责任链。

我们可以作弊:

 Optional<Widget> shelfWidget = getShelfWidget(request);  Optional<Widget> backroomWidget = getBackroomWidget(request);  Optional<Widget> supplierWidget = getSupplierWidget(request);  return firstNonEmpty(shelfWidget, backroomWidget, supplierWidget);  private static Optional<Widget> firstNonEmpty( Optional<Widget> ... options) { return Arrays.stream(options) .filter(Optional::isPresent) .findFirst() // makes an optional of optional here... .orElse(Optional.empty());  } 

上面的代码更好一些,但是现在必须在选择一个之前预先计算所有可能的答案。 如果答案很快就会出现,我们就需要避免成本高昂的期权计算。

带有可选解决方案的第一个过去的帖子

将流或varargs数组传递给一个函数,该函数由将提供可选参数的对象组成。 如果它们中的任何一个提供非空值,则获胜。

 // calling code  public Optional<Widget> getAppropriateWidget(CustomerRequest request) { return firstAvailable(() -> getShelfWidget(request), () -> getBackroomWidget(request), () -> getSupplierWidget(request));  }  // this is a general purpose solution  // feel free to use it  @SafeVarargs  private static <T> Optional<T> firstAvailable( Supplier<Optional<T>> ... options) { return Arrays.stream(options) .map(Supplier::get) .filter(Optional::isPresent) .findFirst() .orElse(Optional.empty());  } 

翻译自: https://www.javacodegeeks.com/2019/11/first-past-the-post.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ Qt全局异常处理器_QT教程

点击上方 蓝字关注我们今日资源今天的资源是另一套QT教程&#xff0c;某马发的&#xff0c;网上搜集到的。这已经是这个公众号发放的第三套QT教程了。关于QT&#xff1a;Qt(官方发音 [kju:t]&#xff0c;音同 cute)是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面…

inputdstream mysql_【sparkStreaming】将DStream保存在MySQL

package SparkDemoimport java.sql.{Connection, DriverManager, PreparedStatement}import org.apache.spark.SparkConfimport org.apache.spark.streaming.{Seconds, StreamingContext}object DStreamToMySQL {//定义更新函数def updateFunc(newValues : Seq[Int],state :Opt…

无线设置 用户_无线WiFi远距离无线蹭网怎么中继桥接组网【详细介绍】

自从小编每天分享各种各样的无线无线WiFi蹭网、桥接、远距离组网等实例&#xff0c;吸引了很多朋友的兴趣&#xff0c;有很多网友通过关心我后&#xff0c;给我私信&#xff0c;求助我一些相关的问题&#xff0c;还有一些朋友建议我出一些教程。首先小编觉得有些东西只能意会不…

Hibernate和UUID标识符

介绍 在我以前的文章中&#xff0c;我讨论了UUID代理密钥以及用例 &#xff0c; 这些用例比更常见的自动递增标识符更合适。 UUID数据库类型 有几种表示128位UUID的方法&#xff0c;每当有疑问时&#xff0c;我都希望向Stack Exchange寻求专家建议。 由于通常对表标识符进行索…

应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1

《点赞应用》app是一款实用的视频生成器工具&#xff0c;用户可以利用它为自己的视频添加各种各样的点赞效果。应用内含有多种类型的模板&#xff0c;都是免费使用的&#xff0c;想要将你的视频变得更有趣吗&#xff1f;快来下载体验一下这款应用吧&#xff01;软件特色1、这个…

mysql+默认值+default_十六、MySQL 中数据类型的默认值 - default 约束-搜云库

MySQL 中&#xff0c;所有的数据类型&#xff0c;都可以显式或隐式的拥有默认值。我们可以使用 DEFAULT 约束显式的为列指定一个默认值。比如CREATE TABLE t1 (i INT DEFAULT -1,c VARCHAR(10) DEFAULT ,price DOUBLE(16,2) DEFAULT 0.00);在上面这条语句中&#xff0c;我们为 …

SQL即服务

自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司&#xff0c;也曾尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

c++ vector 一部分_《JACS》:在富电子C-H键位点上实现光控活性聚合

可逆加成-断裂链转移(RAFT)自由基活性聚合是一种调控聚合物结构组成、分子量和分布的重要聚合方法&#xff0c;其中&#xff0c;光诱导电子/能量转移(PET)的RAFT聚合反应是一种更精确的调控手段&#xff0c;因而经常被用于设计具有复杂3D分子结构的聚合物。然而常规的PET-RAFT法…

phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置

忘记phpmyadmin密码怎么重置,新密码,教程,相关文章,重新启动,跳过忘记phpmyadmin密码怎么重置易采站长站&#xff0c;站长之家为您整理了忘记phpmyadmin密码怎么重置的相关内容。1、停止mysql服务&#xff1a;/etc/init.d/mysql stop2、跳过验证启动MySQL/usr/local/mysql/bin/…

java中避免空指针_在Java中避免空检查

java中避免空指针对于Java开发人员&#xff08;从初级到专家&#xff09;最糟糕的噩梦之一是空对象引用检查。 我很确定您已经看过几次这样的代码&#xff1a; public void addAddressToCustomer(Customer customer, Address newAddress){if ( cutomer null || newAddress n…

纵横免root框架打不开应用怎么办_很好用的软件多开神奇安卓欧皇十框架!!!...

欧皇十框架这是一款兼容安卓10的应用框架&#xff0c;轻松实现应用多开&#xff0c;可以完美免ROOT运行GG修改器&#xff0c;专为和平精英游戏设计&#xff0c;软件体积小&#xff0c;运行稳定。修改说明&#xff1a;1.支持更多应用游戏的多开、双开&#xff0c;使用更稳定、快…

用java和mysql开发网站怎么实现_如何用java开发一个网站?

java语言和类库&#xff1a;java语言是支持整个java技术的底层基础&#xff0c;java类库是随java语言Java 运行系统&#xff1a;主要指java虚拟机&#xff0c;负责将java与平台无关的中间代码翻译成本机的Java applet :Java applet 是用java语言编写的小应用程序&#xff0c;通…

Elasticsearch SQL

Elasticsearch引擎 Elasticsearch是当今许多生产部署中使用最广泛的搜索引擎之一。 它基于Lucene搜索库&#xff0c;它提供的主要功能之一是在Lucene之上的基于JSON的查询DSL&#xff0c;它提供了一种易于使用的机制来与搜索引擎进行交互。 但是&#xff0c;查询DSL非常特定于E…

电脑无internet访问_电脑中的代理服务器怎么设置 代理服务器设置方法 - 操作系统...

如何设置电脑中的代理服务器?对于代理服务器&#xff0c;可能大家对其并不是非常了解&#xff0c;其实代理服务器作为一种特殊的网络服务&#xff0c;可以代理网络用户去获取网络信息&#xff0c;提高浏览速度与效率&#xff0c;而且还可以突破自身IP的访问限制&#xff0c;访…

mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义

展开全部先进先出(62616964757a686964616fe58685e5aeb931333433653339FIFO&#xff0c;first-in&#xff0c;first-out)为处理从队列或堆栈发出的程序工作要求的一种方法&#xff0c;它使最早的要求被最先处理。后进先出&#xff0c;从栈中取出数据项的顺序与将它们插入栈的顺序…

平台框架_从框架到平台

平台框架当我在十年前以Java开发人员的身份开始职业生涯时&#xff0c;该行业正经历着革命性的变化。 2003年发布的Spring框架Swift流行&#xff0c;并成为庞大的J2EE平台的严重挑战者。 经过过渡时间后&#xff0c;我很快发现自己赞成使用Spring框架而不是J2EE平台&#xff0c…

敲代码时如何快速移动光标_如何用 Linux 技巧大大提高工作效率?

前言Linux中的一些小技巧可以大大提高你的工作效率&#xff0c;本文就细数那些提高效率或者简单却有效的Linux技巧。命令编辑及光标移动这里有很多快捷键可以帮我们修正自己的命令。接下来使用光标二字代替光标的位置。删除从开头到光标处的命令文本ctrl u&#xff0c;例如&am…

Java 13:文本块

Java 13已交付了期待已久的多行字符串或Text Blocks 。 您不再需要连接跨越多行的字符串或转义特殊字符&#xff0c;这确实提高了代码的可读性。 文本块是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译器和运行时中明确启用它们。 这是一个文…

java 异常练习题_java入门异常处理练习题问题

tppe大概方式&#xff1a;1、判断用户输入的类型是否正确&#xff0c;不正确捕获异常&#xff0c;把他包装成我自己定义的异常2、判断用户输入的数是多少2.1、如果是1&#xff0c;则打印“输入图书名称”&#xff0c;用户输入&#xff0c;定义一个Book类型的数组&#xff0c;然…

windows副本不是正版怎么办_盗版系统总是崩溃?别着急,让我来告诉你正版系统怎么下载...

电脑系统崩溃了怎么办&#xff1f;相信很多小伙伴都会选择重装系统&#xff0c;奈何自己又不会&#xff0c;只能搬到修电脑的地方&#xff0c;最后发现安装的还是盗版系统&#xff0c;不能登录微软账号不说&#xff0c;还会被捆绑安装一堆流氓软件&#xff0c;那么&#xff0c;…