Java 8 Optional不仅用于替换空值

总览

在Java 8中,您可以返回Optional而不是返回null。 就像您在Java 7中所做的那样。这取决于您是否倾向于忘记检查null还是使用静态代码分析检查对nullalbe的引用,这可能有很大的不同。

但是,还有一种更引人注目的情况是将Optional视为具有0或1值的Stream。

简单的可选用例

在Java 7的旧时代中,您将编写如下内容:

String text = something();
if (text != null) {

注意: Oracle Java 7将在2015年4月“公开更新结束”。

使用Optional可以编写:

Optional text = something();
if (text.isPresent()) {String text2 = text.get();

但是,如果您偏执狂,您可能会写。

Optional text = something();
if (text != null && text.isPresent()) {String text2 = text.get();

如果您的项目中经常出现NullPointerException错误,则Optional可能会有所帮助,但否则看起来并没有太大帮助。

一个更复杂的例子

让我们考虑一下这个例子

static String getFirstSecondThird(Nested nested) {try {return ((Contained2) nested.first.second).get(0).third;} catch (NullPointerException | ClassCastException | IndexOutOfBoundsException ignored) {return null;}
}

这真的很丑。 您可以构建一长串条件检查,而不是捕获异常,但要查看要执行的操作却变得非常困难。

可选允许您处理所有可能的错误情况,而无需使用Exception或嵌套的if / else逻辑。

static Optional getFirstSecondThird(Optional nested) {return nested // could be non-present.map(x -> x.first) // could be null.map(x -> x.second) // could be null// could be another type.map(x -> x instanceof Contained2 ? (Contained2) x : null).map(x -> x.list) // could be null.filter(x -> !x.isEmpty()) // could be empty.map(x -> x.get(0)) // could be null.map(x -> x.third); // could be null.
}

我们得到的是一系列映射和过滤器,它们只有在值非空且存在的情况下才进行。 如果任何值为null或过滤器为true,则整个结果为“不存在”。

结论

使用Optional是一种以安全的方式导航复杂数据结构的有效方法。 lambda的目的是减少样板代码,并在这种情况下避免了所有检查或错误。

额外

为了您的兴趣,这是我在上面的示例中使用的类。

static class Nested {Contained first;
}static class Contained {IContained2 second;
}interface IContained2 {
}static class Contained2 implements IContained2 {List list;
}static class Data {String third;
}

翻译自: https://www.javacodegeeks.com/2015/02/java-8-optional-is-not-just-for-replacing-a-null-value.html

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

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

相关文章

WCF学习笔记之序列化

DataContractAttribute 与 DataMenberAttribute DataContractAttribute该特性只能用于枚举、类和结构体,而不能用于接口;又因为DataContractAttribute是不可以被继承的,所以要所有作为数据契约的类型自身必须有这么一个特性;而且一…

转载[POJ题型分类]

北大ACM题分类 主流算法: 1.搜索 //回溯 2.DP(动态规划)  3.贪心  4.图论 //Dijkstra、最小生成树、网络流 5.数论 //解模线性方程 6.计算几何 //凸壳、同等安置矩形的并的面积与周长 7.组合数学 //Polya定理 8.模拟  9.数据结构 //…

在AWS Elastic MapReduce上运行PageRank Hadoop作业

在上一篇文章中,我描述了执行PageRank计算的示例,该示例是使用Apache Hadoop进行Mining Massive Dataset课程的一部分。 在那篇文章中,我接受了Java中现有的Hadoop作业,并做了一些修改(添加了单元测试,并通…

java sort 第二个参数_详解java Collections.sort的两种用法

Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:public static > void sort(List list) {list.sort(null);}public static void sort(List list, Comparator super T> c) {lis…

MVC3 中使用Unity实现依赖注入

前言:前段时间一直在研究依赖注入,不过不是在MVC框架中使用,今天突然想到在MVC中使用Unity实现依赖注入,一时慌了,不知道从何下手,接着就是网上不停的找资料,下面我把我找到的资料分享下&#x…

避免在ConcurrentHashMap.computeIfAbsent()中进行递归

有时我们会提供糟糕的建议。 就像该文章中有关如何将Java 8用于缓存的功能性方法来计算斐波那契数的文章一样 。 正如我们的读者之一马蒂亚斯(Matthias)在评论中注意到的那样 ,提出的算法可能永远不会停止。 考虑以下程序: publi…

java调用wvsc.exe_c语言 函数的调用方法

欢迎加入编程爱好者 QQ群 群号 57616770中都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调在第一章中已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序用实…

ms2005 SQL Server设置改为SQL Server身份验证

1.为 SQL Server 2005 Express Edition 或 SQL Server 2005 Developer Edition 启用远程连接 必须为要从远程计算机连接到的每个 SQL Server 2005 实例启用远程连接。为此,请按照下列步骤操作: 1.单击“开始”,依次指向“程序”、“Microsoft…

JPA和Hibernate级联类型的初学者指南

介绍 JPA将实体状态转换转换为数据库DML语句。 由于对实体图进行操作很常见,因此JPA允许我们将实体状态更改从父级传播到子级 。 通过CascadeType映射配置此行为。 JPA与Hibernate级联类型 Hibernate支持所有JPA级联类型和一些其他旧式级联样式。 下表绘制了JPA级…

EE JSP:使用JSTL标记库生成动态内容

除了在JSP中编写自己的定制标记之外,您还将发现Java EE实际上提供了一组Java标准标记库(JSTL)供您使用。 这些内置标签包括重复(for-loop)标签,条件标签,变量声明和输出标签等。库还带有许多实用…

Sublime text 2下alignment插件无效的解决办法

在sublime text 2中安装了alignment插件,但使用快捷键‘ctrlalta无效,经过各种方法依然无效,最后找到了这个“Doesnt work at all for me (full steps)”,方法就是用sb打开%sb 路径%\Data\Packages\Alignment目录下的alignment.py…

php入口函数,php 常用的系统函数

字符串函数strlen:获取字符串长度,字节长度substr:字符串截取,获取字符串(按照字节进行截取)strchr:与substr相似,从指定位置截取一直到最后strrchr(获取文件后缀名):与strchr一样,只…

startActivityForResult的使用和用法

startActivityForResult的使用和用法 startActivityForResult 和 onActivityResult在activity间传递数据AndroidManifest.xml<applicationandroid:icon"drawable/ic_launcher"android:label"string/app_name" ><activityandroid:name".KakuL…

如何使用Java泛型映射不同的值类型

有时&#xff0c;一般的开发人员会遇到这样的情况&#xff0c;即他必须在特定容器内映射任意类型的值。 但是&#xff0c;Java集合API仅提供与容器相关的参数化。 例如&#xff0c;这将HashMap的类型安全使用限制为单个值类型。 但是&#xff0c;如果您想混合苹果和梨怎么办&am…

php用正则去掉一些固定字符,用PHP正则表达式清除字符串的空白

我们经常会处理来自用户输入或从数据库中读取的数据&#xff0c;可能在你的字符串中有多余的空白或制表符&#xff0c;回车等。存储这些额外的字符是有点浪费空间的。如果您想要去掉字符串开始和结束的空白可以使用PHP内部函数trim() 。但是, 我们经常想完全清除空白。需要把开…

Windows上编译libpng

Windows上编译libpng 下载libpng 1.5.10并解压到[工作目录]/png/libpng-1.5.10 用CMake选择png/libpng-1.5.10目录并Configure&#xff1a; CMAKE_C_FLAGS_DEBUG/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1 CMAKE_C_FLAGS_RELEASE/MT /O2 /Ob2 /D NDEBUG CMAKE_INSTALL_PREFIX[工作目录…

在Graphite中存储Hystrix的几个月历史指标

Hystrix的杀手级功能之一是低延迟&#xff0c;数据密集型且美观的仪表板 &#xff1a; 即使这只是Hystrix实际操作的副作用&#xff08;断路器&#xff0c;线程池&#xff0c;超时等&#xff09;&#xff0c;它也往往是最令人印象深刻的功能。 为了使其工作&#xff0c;您必须…

html和php文件怎么连接,html页面跟php文件连接的方法

html页面跟php文件连接的方法发布时间&#xff1a;2020-09-25 11:11:05来源&#xff1a;亿速云阅读&#xff1a;115作者&#xff1a;小新小编给大家分享一下html页面跟php文件连接的方法&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一下&…

java定义一个course类,求指教定义一个学生类 ,大学生小学生,定义一个选课接口...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼interface XC{abstract String CourseName();abstract String CourseID();}abstract class Student{protected String Name;protected String Ban;protected String Sex;public Student(){}public Student(String Name,String Ban,…

NYOJ-----最少乘法次数

最少乘法次数 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述给你一个非零整数&#xff0c;让你求这个数的n次方&#xff0c;每次相乘的结果可以在后面使用&#xff0c;求至少需要多少次乘。如24&#xff1a;2*222&#xff08;第一次乘&a…