sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

java 8 optional_JDK8的Optional用法,isPrensent(),判断Optional是否有值,返回boolean类型
https://blog.csdn.net/weixin_42466868/article/details/114100592

https://mp.weixin.qq.com/s/P2kb4fswb4MHfb0Vut_kZg

1. 描述

Optional是java.util包中的一部分,所以要有相关的引用:

import java.util.Optional;

2. 创建Optional方法

2.1 empty,创建一个空的Optional

@Testpublic voidwhenCreatesEmptyOptional_thenCorrect() {

Optional empty =Optional.empty();

assertFalse(empty.isPresent());

}

2.2 of,创建Optional,使用of方法时,传入不能为null,否则会报NullPointerException异常:

@Testpublic voidgivenNonNull_whenCreatesNonNullable_thenCorrect() {

String name= "baeldung";

Optional opt =Optional.of(name);

assertTrue(opt.isPresent());

}

2.3 ofNullable,创建Optional,ofNullable方法是允许值为null的

@Testpublic voidgivenNonNull_whenCreatesNullable_thenCorrect() {

String name= "baeldung";

Optional opt =Optional.ofNullable(name);

assertTrue(optionalName.isPresent());

}

3. 判断Optional的值

3.1 isPrensent,判断Optional是否有值,返回boolean类型,上面几个创建例子都用了isPresent,源码:

public booleanisPresent() {

return value != null;

}

3.2 ifPrensent,如果Optional有值,执行后面函数

@Testpublic voidgivenOptional_whenIfPresentWorks_thenCorrect() {

Optional opt = Optional.of("baeldung");

opt.ifPresent(name->System.out.println(name.length()));

}

如果在Optional为null的情况下,直接使用ifPresent有可能会报NullPointerException,所以就有了下面几个函数。

3.3 orElse和orElseGet,返回Optional包裹的值,如果值为null,则返回函数内的默认值,这两个方法的区别在于orElse后面跟默认值对象,orElseGet跟的是表达式函数。

@Testpublic voidwhenOrElseWorks_thenCorrect() {

String nullName= null;

String name= Optional.ofNullable(nullName).orElse("john");

assertEquals("john", name);

}

@Testpublic voidwhenOrElseGetWorks_thenCorrect() {

String nullName= null;

String name= Optional.ofNullable(nullName).orElseGet(() -> "john");

assertEquals("john", name);

}

3.4 orElseThrow,返回Optional包裹的值,如果值为null,则抛出异常

@Test(expected = IllegalArgumentException.class)public voidwhenOrElseThrowWorks_thenCorrect() {

String nullName= null;

String name=Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);

}

3.5 get,返回Optional包裹的值,如果值为null,会抛出NoSuchElementException异常

@Test(expected = NoSuchElementException.class)public voidgivenOptionalWithNull_whenGetThrowsException_thenCorrect() {

Optional opt = Optional.ofNullable(null);

String name=opt.get();

}

4. Optional值的操作

4.1 map,将一个值转换成另一个值,下面的例子是返回字符串的长度,没有则返回默认值0

@Testpublic voidgivenOptional_whenMapWorks_thenCorrect2() {

String name= "baeldung";

Optional nameOptional =Optional.of(name);int len =nameOptional.map(String::length).orElse(0);

assertEquals(8, len);

}

4.2 filter,用于过滤。接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象

@Testpublic voidwhenOptionalFilterWorks_thenCorrect() {

Integer year= 2016;

Optional yearOptional =Optional.of(year);boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();

assertTrue(is2016);boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();

assertFalse(is2017);

}

5. 与Lambda表达式结合使用,优化代码

5.1 条件为true就执行

优化前:

String person = "wo are you";

if(person != null){

System.out.println(person);

}

优化后:

Optional optional = Optional.of("wo are you");

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

5.2 条件为true就返回,false返回默认值

优化前:

String person = "wo are you";if(person != null){

System.out.println(person);

}else{returnDEFAULT_VALUE;

}

优化后:

Optional optional = Optional.of("wo are you");return optional.orElse(DEFAULT_VALUE);

5.3 条件为true就返回,false调用函数生成

优化前:

String person = "wo are you";if(person != null){

System.out.println(person);

}else{return createPerson();

}

优化后:

Optional optional = Optional.of("wo are you");return optional.orElseGet(t -> createPerson());

5.4 连环null检查

优化前:

Person person = new Person("Tom");if(person != null){

String name=person.getLastName();if(name != null){returnname.toLowerCase();

}else{return null;

}

}else{return null;

}

优化后:

Optional optional = Optional.ofNullable(new Person("Tom"));return optional.map(p -> p.getLastName()).map(name -> name.toUpperCase()).orElse(null);

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树Optional一致性15512 人正在系统学习中
posted on 2022-05-08 22:41  sunny123456  阅读(824)  评论(0编辑  收藏  举报