在开发过程中,您将遇到空验证。如果您不执行判决,则会产生NullPoInterException Anbories。以下代码可以直接使用。
user.getAddress()。getProvince();
当用户为null时,空气指针异常,并且常规解决方案如下:
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}}
这种写作方式很丑陋。为了避免上述丑陋的写作,丑陋的设计是优雅的。Java8提供了以这种方式优化的可选类。
首先介绍API。与其他文章不同,本文采用了类比,并同时结合了源代码。与其他文章一样,API逐一列出,使人们无法找到重点。
这四个函数具有相关性,因此将它们放在组中以进行内存。首先解释,可选(t值),即构造函数,这是私有权限,无法从外部调用。其余三个功能是公开的我们要致电的权限。然后,可选的本质是在内部存储一个真实的价值。构造时,它直接确定其值是否为空。嗯,这仍然更加抽象。直接在可选(t值)构造函数的源代码上,如下图所示
然后,(t值)的源代码如下
公共静态
换句话说,构造函数在(t值)内部都调用。根据构造函数的源代码,我们可以得出两个结论:
此外,可选类还将值保持为null。
公共最终课程可选
然后,空的作用()是返回空对象。okay,如此多的方式,可以说是nullable(t value)的作用,上限源代码
公共静态
好吧,每个人都应该理解它的含义。
@test public void test(){user user = null;user =可选。nullable(user).orelse(createUse());user =可选。fnulse(userLseget(() - > createuser(())。公共用户createuseer(){user user = new user(); user.setName(“ zhangsan”); return user;};}
这两个函数之间的区别:当用户值不为null时,ORELSE函数仍然执行CreateUser()方法,而ORELSEGET函数不会执行CreateUser()方法。每个人都可以自己测试。
用户用户= null;可选的。nullable(用户).orelsethrow(() - >新异常(“不存在用户”));
这两个功能放在一组内存中,这两个功能执行转换值的操作。直接源代码
公共最终课程可选
这两个功能在功能主体上没有差异。唯一的区别是参数。 super T, ? extends U>和FlapMap的输入类型是功能 super T, Optional>特定用法的essencein术语,用于地图:如果用户结构是以下内容
公共类用户{私有字符串名称;public String getName(){返回名称;}}
目前,名称的写作如下所示
字符串city =可选。nullable(用户).map(u-> u.getName())。得到 ();得到 ();
对于flatmap:如果用户结构为以下
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();} 0
目前,名称的写作如下所示
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();} 1} 1
将这两个函数放在一起以记住,并且ISPRESENT确定值值是否为空,而IFPRESENT是在值不为空的时进行某些操作。这两个函数的源代码如下
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();} 2
源代码:
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}} 3
滤波器方法接受谓词来过滤可选中包含的值。如果该值包含符合条件,则返回此可选。否则,返回可选。
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();} 4
如上所示,如果用户的长度小于6,则返回。如果大于6,则返回一个空对象。
在功能方法中,先前的写作方法
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}} 5
Java8写作
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();} 6
例如,在主要程序中,先前的写作
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}} 7
Java8写作
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}} 8
以前的写作
if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}} 9
Java8写作
公共静态
其他示例并未一一列出。但是,使用该链条编程,尽管代码优雅。但是,逻辑并不那么明显,并且可读性降低。