动手学习_动手选择值

动手学习

由于冠状病毒的存在,可选的东西在空中,一切都变得可选,例如可选的公共聚会,可选的在家工作,可选的旅行等。

我现在是时候谈论处理NULL引用的软件工程中真正的“ 可选 ”了。

托尼·霍尔(Tony Hoare)坦言,他发明了空(Null)犯了数十亿美元的错误。 如果您还没有看过他的演讲,那么我建议您看一下Null-References-The-Billion-Dollar-Mistake 。

我将与null分享一些反模式 ,以及如何使用Optional或MayBe这样的抽象方法解决它。

在此示例中,我们将使用可以包含一些空值的简单值对象。

public class Person {final String firstName;final String lastName;final String email; // This can be nullfinal String phone; //This can be null
}

该值对象的电子邮件和电话号码可以为空值。

方案:电子邮件和电话号码上的联系人

不使用可选

第一次尝试将基于检查null,如下所示

//Not using optionalif (p.email != null) {System.out.println("Sending email to " + p.email);}if (p.phone != null) {System.out.println("Calling " + p.phone);}

这是多年来所做的。 具有收集结果的另一种常见模式。

List<Person> p = searchPersonById("100");if (p.isEmpty()) {System.out.println("No result");} else {System.out.println("Person" + p.get(0));}

以错误的方式使用可选

Optional<String> phone = contactNumber(p);Optional<String> email = email(p);if (phone.isPresent()) {System.out.println("Calling Phone " + phone.get());}if (email.isPresent()) {System.out.println("Sending Email " + email.get());}

这样做好一点,但是通过在代码中添加if / else块,将Optional的所有优点都抛弃了。

永远快乐可选

//Always HappyOptional<String> phone = contactNumber(p);Optional<String> email = email(p);System.out.println("Calling Phone " + phone.get());System.out.println("Sending Email " + email.get());

很高兴感到高兴,但是当您尝试使用Optional时,您所做的假设很大,或者您不需要Optional。

嵌套属性可选

对于这种情况,我们将扩展Person对象并添加Home属性。 并非每个人都可以拥有房屋,因此最好不要使用该房屋。 让我们看看在这种情况下联系人场景如何工作

//Nested Propertyif (p.getHome() != null) {System.out.println("Sending Postal mail " + p.getHome().address);}if (p.getHome() != null && p.getHome().getInsurance() != null) {System.out.println("Sending Notification to insurance " + p.getHome().getInsurance().getAgency());}

在这里,代码将具有大量嵌套的空检查变得越来越糟。

基于优先级的默认

在这种情况下,我们首先尝试通过家庭住址与他人联系,如果该人不可用,则请通过办公地点与他人联系。

//Address has priority , first home and then Officeif (p.home != null) {System.out.println("Contacted at home address " + p.home.address);return; // Magical return for early exit}if (p.office != null) {System.out.println("Contacted at office address " + p.office.address);return; // Magical return for early exit}

这种类型的场景需要使用提前控制流来尽早返回,并使代码难以理解和维护。

这些是一些常见模式,其中未使用可选选项或使用了错误的方式。

可选使用方式

让我们看看一些使用可选的好方法。

根据领域知识使属性为可选

使属性成为可选属性非常容易。

public Optional<String> getEmail() {return Optional.ofNullable(email);}public Optional<String> getPhone() {return Optional.ofNullable(phone);}

是的,允许将其设为“可选”,没有人会为此而绞尽脑汁,并且可以毫无恐惧地随意这样做。 更改完成后,我们可以编写如下内容

//Use Optionalp.getEmail().ifPresent(email -> System.out.println("Sending email to " + email));p.getPhone().ifPresent(phone -> System.out.println("Calling " + phone));//Optional for Collection or Search type of requestOptional

It looks neat, first step to code without explicit if else on application layer.

Use some power of Optional

//Use IfPresent & other cool thingsphone.filter(number -> hasOptIn(number)).ifPresent(number -> System.out.println("Calling Phone " + number));email.filter(m -> hasOptIn(m)).ifPresent(m -> System.out.println("Sending Email " + m));

Optional is just like stream, we get all functional map,filter etc support. In above example we are checking for OptIn before contacting.

Always happy optional

Always happy optional that calls "get" without check will cause runtime error on sunday midnight, so it advised to use ifPresent

//Don't do thisSystem.out.println("Calling Phone " + phone.get());System.out.println("Sending Email " + email.get());//Use ifPresent to avoid runtime errorphone.ifPresent(contact -> System.out.println("Sending email to " + contact));email.ifPresent(contact -> System.out.println("Calling " + contact));

Nested Optional

p.getHome().ifPresent(a -> System.out.println("Sending Postal mail " + a.address));p.getHome().flatMap(Person.Home::getInsurance).ifPresent(a -> System.out.println("Sending Notification to insurance " + a.agency));

Flatmap does the magic and handles null check for home and convert  insurance object also.

Priority based default

//Address has priority , first home and then OfficeOptional<String> address = Stream.of(person.getHome().map(Home::getAddress), person.getOffice().map(Office::getAddress)).filter(Optional::isPresent).map(Optional::get).findFirst();address.ifPresent(add -> System.out.println("Contacting at address " + add));

This example is taking both home & office address and pick the first one that has value for sending notification. This particular pattern avoids lots of nested loops.

Else branch

Optional has lots of ways to handle else part of the scenario like returning some default value(orElse) , lazy default value (orElseGet) or throw exception(orElseThrow).

What is not good about optional

Each design choice has some trade off and optional also has some. It is important to know what are those so that you can make careful decision.

Memory indirection

As optional is container , so every access to value need extra jump to get real value. Optional is not good choice for element in array or collection.

No serialization

I think this is good decision by Jdk team that does not encourage people to make instance variable optional. You can wrap instance variable to Optional at runtime or when required for processing.

翻译自: https://www.javacodegeeks.com/2020/03/hands-on-optional-value.html

动手学习

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

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

相关文章

JVM菜鸟进阶高手之路

本文转载自公众号 匠心零度问题现象 代码如下&#xff0c;使用 ParNew Serial Old 回收器组合与使用 ParNew CMS 回收器组合时&#xff0c;结果为什么差异如此之大 &#xff1f;private static final int _1MB 1024 * 1024;public static void main(String[] args) throws …

事务的状态(状态模式)

【0】README0.1&#xff09;本文部分文字描述转自 “head first设计模式”&#xff0c;旨在学习 事务的状态&#xff08;状态模式&#xff09; 的基础知识&#xff1b;【1】应用场景一1.1&#xff09;还记得成都市各大高校内的米源自动售卖机吗&#xff1f;售卖机的主要制造商…

ogm neo4j_Neo4J OGM与Quarkus

ogm neo4j在下面的视频中&#xff0c;我演示了一个使用Neo4J数据库和Neo4J OGM的Quarkus应用程序示例。 看一下GitHub上的示例项目 。 我为咖啡豆创建了一个示例域&#xff0c;其中包含我们可以查询和匹配的某些风味配置文件。 红色节点是来自某个国家/地区的咖啡豆&#xff…

什么是ThreadLocal

本文转载自 占小狼的博客前言在面试环节中&#xff0c;考察"ThreadLocal"也是面试官的家常便饭&#xff0c;所以对它理解透彻&#xff0c;是非常有必要的. 有些面试官会开门见山的提问&#xff1a; “知道ThreadLocal吗&#xff1f;”“讲讲你对ThreadLocal的理解”…

Java bytecode instruction listings

【0】README 0.1&#xff09;these contents are shiped from https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings Mnemonic Opcode (in hexadecimal) Opcode (in binary) Other bytes Stack [before]→[after] Description(no name)cb-fd these values ar…

为wmi执行例外_称之为例外?

为wmi执行例外虽然这是一个有关测试和Wiremock的Java示例&#xff0c;但它涉及一个更普遍的问题。 我们正在尝试重试Wiremock的verify方法&#xff0c;该方法可能会在我们要检查的端点被命中之前由测试调用。 在这种情况下&#xff0c;我们希望在几秒钟后循环尝试一次&#xf…

漫画:什么是MapReduce

转载自 脑洞有点大的 程序员小灰什么是MapReduce&#xff1f;MapReduce是一种编程模型&#xff0c;其理论来自Google公司发表的三篇论文&#xff08;MapReduce&#xff0c;BigTable&#xff0c;GFS&#xff09;之一&#xff0c;主要应用于海量数据的并行计算。MapReduce可以分…

orelse_可选的orElse vs orElseGet

orelseJava 8引入了一个很棒的Optional概念&#xff0c;我们在博客Java 8 Optional中进行了研究 。 因此&#xff0c;为了简要说明一下&#xff0c;Optional用于表示Optional对象或空值&#xff0c;而不是null引用。 这将有助于避免在我们尝试对空引用对象执行某些操作时发生空…

jvm(6)-java类文件结构(字节码文件)

【0】README0.1&#xff09;本文部分文字描述转自 “深入理解jvm”&#xff0c;旨在学习类文件结构 的基础知识&#xff1b;0.2&#xff09;本文荔枝以及荔枝的分析均为原创&#xff1b;0.3&#xff09;下面的截图中有附注t*编号&#xff0c;不关乎博文内容&#xff1b;0.4&am…

你可能不知道的 10 条 SQL 技巧

转载自 58沈剑 开源中国 一、一些常见的SQL实践 &#xff08;1&#xff09;负向条件查询不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好习惯 可以优化为in查询&#xff1a; select * from order where status in(2,3) &#x…

夜神模拟器模拟安卓测试_使用模拟进行测试

夜神模拟器模拟安卓测试如果使用正确的方法&#xff0c;模拟对象将非常有用。 我在需要驱动软件开发使用的帖子中分享了一些使用Mock Objects的经验。 在这篇文章中&#xff0c;我分享了两件事 –使用模拟进行基于合同的测试。 –用于组织模拟代码的模式。 基于合同的测试 …

java记录类型_Java中的记录类型

java记录类型于2020年3月发布的JDK 14引入了记录 &#xff08;预览语言功能&#xff09;&#xff0c;该记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 &#xff0c;所有低级&#xff0c;重复且容易出错的代码都类似于构造函数&#xff0c;访问器和通用方法&a…

代理模式(多线程实现状态监控)

【-1】README-1.1&#xff09;本文部分文字描述转自“head first 设计模式”&#xff0c;旨在学习 远程代理对象 的基础知识&#xff1b;-1.2&#xff09;多线程实现糖果自动售卖机监控程序为原创&#xff1b;-1.3&#xff09;博文最后&#xff0c;转载了代理模式的定义&#…

一篇文章搞定面试中的二叉树

转载自 IOExceptioner 算法与数据结构 在上一篇介绍二叉树&#xff08; Android面试题算法之二叉树 、红黑树详细分析&#xff0c;看了都说好&#xff09;&#xff0c;没看的读者建议先去了解了解&#xff0c;接下来再给大家带来一篇关于二叉树的文章。 最近总结了一些数据结…

清洁代码_清洁单元测试

清洁代码编写使用JUnit和某些模拟库的“单元测试”测试很容易。 即使测试甚至不是单元测试并提供可疑的价值&#xff0c;它们也可能产生使某些涉众满意的代码覆盖范围。 编写单元测试&#xff08;在理论上是单元测试&#xff0c;但是比基础代码更复杂&#xff09;因此也很容易编…

jvm(6)-Class字节码文件结构总结

【0】README 0.1&#xff09;本文总结于 Clas字节码文件&#xff0c;旨在理清 Class字节码文件的大体结构&#xff1b; 【1】干货开始 对上图的分析&#xff08;Analysis&#xff09;&#xff1a;A1&#xff09;offset0 A1.1&#xff09;头四个字节为CAFEBABE&#xff1a;表示…

Android面试题算法之二叉树

转载自 qing的世界 程序员小乐文章目录 前言二叉树的递归&#xff08;深度优先&#xff09;处理二叉树的层序处理(广度优先)总结“一、前言今年可谓是跌宕起伏的一年&#xff0c;幸好结局还算是圆满。开年的时候由于和公司CTO有过节&#xff0c;被"打入冷宫"&#…

java 读取 文本块_Java文本块

java 读取 文本块文本块是JDK增强建议&#xff08; JEP 355 &#xff09;&#xff0c;可以在JDK 13和14中用作预览语言功能。它计划在JDK 15中成为永久性功能。文本块是跨越多行并且不需要的String文字。对于大多数转义序列。 动机 在标准Java字符串中嵌入XML&#xff0c;JSON…

代理模式之虚拟代理(仅了解)

【0】README0.1&#xff09;本文全文转自 “head first 设计模式”&#xff0c;旨在了解 虚拟代理动态代理&#xff1b;0.2&#xff09;晚辈我 java.swing 烂到渣&#xff0c;没有写出干货荔枝&#xff0c;抱歉&#xff1b;【1】虚拟代理简述1&#xff09;远程代理&#xff1a;…

红黑树详细分析

转载自 coolblog 算法与数据结构“一、红黑树简介红黑树是一种自平衡的二叉查找树&#xff0c;是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明&#xff0c;在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来&#xff0c;在1978年被 Leo J. Guibas 和 Robert…