当前位置: 首页 > 网络应用技术

Java8空指针的判断新写作

时间:2023-03-07 12:35:31 网络应用技术

  在开发过程中,您将遇到空验证。如果您不执行判决,则会产生NullPoInterException Anbories。以下代码可以直接使用。

  user.getAddress()。getProvince();

  当用户为null时,空气指针异常,并且常规解决方案如下:

  if(user!= null){地址= user.getAddress();if(address!= null){字符串province = address.getProvince();}}

  这种写作方式很丑陋。为了避免上述丑陋的写作,丑陋的设计是优雅的。Java8提供了以这种方式优化的可选类。

  首先介绍API。与其他文章不同,本文采用了类比,并同时结合了源代码。与其他文章一样,API逐一列出,使人们无法找到重点。

  这四个函数具有相关性,因此将它们放在组中以进行内存。首先解释,可选(t值),即构造函数,这是私有权限,无法从外部调用。其余三个功能是公开的我们要致电的权限。然后,可选的本质是在内部存储一个真实的价值。构造时,它直接确定其值是否为空。嗯,这仍然更加抽象。直接在可选(t值)构造函数的源代码上,如下图所示

  然后,(t值)的源代码如下

  公共静态 选修的 (t值){返回新的可选<>(价值);}

  换句话说,构造函数在(t值)内部都调用。根据构造函数的源代码,我们可以得出两个结论:

  此外,可选类还将值保持为null。

  公共最终课程可选 {//省略...私人静态最终可选 空=新的可选<>();private ottional(){this.value = null;} //省略...公共静态 选修的 empty(){@suppresswarnings(“ unched”)可选 t =(可选) 空的;返回t;}}}

  然后,空的作用()是返回空对象。okay,如此多的方式,可以说是nullable(t value)的作用,上限源代码

  公共静态 选修的 nullable(t value){返回值== null?空():of(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(() - >新异常(“不存在用户”));

  这两个功能放在一组内存中,这两个功能执行转换值的操作。直接源代码

  公共最终课程可选 {//省略...公共 选修的 地图(功能 mapper){objects.requirenonnull(mapper);if(!ispreins())返回emperion();其他 选修的 flatmap(功能> mapper){objects.requirenonnull(mapper);如果(!ispreins())返回空();else {return objects.requirennnull(mapper.apply);}}}}}}}}}}}}}}}}}}}}

  这两个功能在功能主体上没有差异。唯一的区别是参数。和FlapMap的输入类型是功能特定用法的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写作

  公共静态 选修的 (t值){返回新的可选<>(值);} 0

  其他示例并未一一列出。但是,使用该链条编程,尽管代码优雅。但是,逻辑并不那么明显,并且可读性降低。