Java JDK8新增Optional工具类讲解

网友投稿 262 2022-10-13


Java JDK8新增Optional工具类讲解

Optional

空指针异Optional常是导致java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

1. 以前对null 的处理

@Test

public void test01(){

//String userName = "张三";

String userName = null;

if(userName != null){

System.out.println("字符串的长度:" + userName.length());

}else{

System.out.println("字符串为空");

}

}

2. Optional类

Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象,它的主要作用就是为了避免Null检查,防止NullpointerException,

3. Optional的基本使用

Optional对象的创建方式

/**

* Optional对象的创建方式

*/

@Test

public void test02(){

// 第一种方式 通过of方法 of方法是不支持null的

Optional op1 = Optional.of("zhangsan");

//Optional op2 = Optional.of(null);

// 第二种方式通过 ofNullable方法 支持null

Optional op3 = Optional.ofNullable("lisi");

Optional op4 = Optional.ofNullable(null);

// 第三种方式 通过empty方法直接创建一个空的Optional对象

Optional op5 = Optional.empty();

}

4. Optional的常用方法

/**

* Optional中的常用方法介绍

* get(): 如果Optional有值则返回,否则抛出NoSuchElementException异常

* get()通常和isPresent方法一块使用

* isPresent():判断是否包含值,包含值返回true,不包含值返回false

* orElse(T t):如果调用对象包含值,就返回该值,否则返回t

* orElseGet(Supplier s):如果调用对象包含值,就返回该值,否则返回 Lambda表达式的返回值

*/

@Test

public void test03(){

Optional op1 = Optional.of("zhangsan");

Optional op2 = Optional.empty();

// 获取Optional中的值

if(op1.isPresent()){

String s1 = op1.get();

System.out.println("用户名称:" +s1);

}

if(op2.isPresent()){

System.out.println(op2.get());

}else{

System.out.println("op2是一个空Optional对象");

}

String s3 = op1.orElse("李四");

System.out.println(s3);

String s4 = op2.orElse("王五");

System.out.println(s4);

String s5 = op2.orElseGet(()->{

return "Hello";

});

System.out.println(s5);

}

@Test

public void test04(){

Optional op1 = Optional.of("zhangsan");

Optional op2 = Optional.empty();

// 如果存在值 就做什么

op1.ifPresent(s-> System.out.println("有值:" +s));

op1.ifPresent(System.out::println);

}

/**

* 自定义一个方法,将Person对象中的 name 转换为大写 并返回

*/

@Test

public void test05(){

Person p = new Person("zhangsan",18);

Optional op = Optional.of(p);

String name = getNameForOptional(op);

System.out.println("name="+name);

}

/**

* 根据Person对象 将name转换为大写并返回

* 通过Optional方式实现

* @param op

* @return

*/

public String getNameForOptional(Optional op){

if(op.isPresent()){

String msg = //op.map(p -> p.getName())

op.map(Person::getName)

//.map(p -> p.toUpperCase())

.map(String::toUpperCase)

.orElse("空值");

return msg;

}

return null;

}

/**

* 根据Person对象 将name转换为大写并返回

* @param person

* @return

*/

public String getName(Person person){

if(person != null){

String name = person.getName();

if(name != null){

return name.toUpperCase();

}else{

return null;

}

}else{

return null;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:工业以太网交换机选择技巧(工业以太网交换机选择技巧图解)
下一篇:工业以太网交换机特点分析及使用注意事项(工业以太网交换机特点分析及使用注意事项解读)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~