函数式编程(JAVA)——Optional类
概述
我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。 尤其是对象中的属性还是一个对象的情况下。这种判断会更多。而过多的判断语句会让我们的代码显得臃肿不堪。所以在JDK8中引入了Optional,养成使用Optional的习惯后你可以写出更优雅的代码来避免空指针异常。
Optional类的常用操作
该类的其实很简单,整体字段属性方法如下图:
下述所有测试代码源码地址:https://gitee.com/ArnoldSu/functionalProgramming.git
of
返回一个Optional对象并且参数必须不能为空,如果为空则报错NullPointerException。
/**
* description Optional of 返回一个Optional对象。(返回一个Optional并且参数必须不能为空,如果为空则报错NullPointerException)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void ofTest() {
Optional<User> userOptional = Optional.of(initUser);
System.out.println(userOptional);
Optional<User> nullUserOptional = Optional.of(null);
System.out.println(nullUserOptional);
}
ofNullable
返回一个Optional对象。(返回一个Optional并且参数可以为null)。
/**
* description Optional ofNullable 返回一个Optional对象。(返回一个Optional并且参数可以为null)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void ofNullableTest() {
Optional<User> userOptional = Optional.ofNullable(initUser);
System.out.println(userOptional);
Optional<User> nullUserOptional = Optional.ofNullable(null);
System.out.println(nullUserOptional);
}
empty
返回一个Optional对象。(返回一个Optional并且参数可以为null)。
/**
* description Optional empty 返回一个空Optional对象。
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void emptyTest() {
System.out.println(Optional.empty());
}
get
返回Optional对象中的值。(为null 则会报错NoSuchElementException)。
/**
* description Optional get 返回Optional对象中的值。(为null 则会报错NoSuchElementException)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void getTest() {
Optional<User> userOptional = Optional.ofNullable(initUser);
System.out.println(userOptional.get());
Optional<User> nullUserOptional = Optional.ofNullable(null);
System.out.println(nullUserOptional.get());
}
ifPresent
如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。(为null 则不会进行输出)。
/**
* description Optional ifPresent 如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。(为null 则不会进行输出)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void ifPresentTest() {
Optional<User> userOptional = Optional.ofNullable(initUser);
userOptional.ifPresent(user -> System.out.println(user.getName()));
Optional<User> nullUserOptional = Optional.ofNullable(null);
nullUserOptional.ifPresent(user -> System.out.println(user.getName()));
}
orElse
如果存在值,则使用该值调用指定的使用者,否则提供一个调用者指定的值返回。(可以理解为没有值给定一个默认值)。
/**
* description Optional orElse 如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。(为null 则new 一个User)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void orElseTest() {
Optional<User> nullUserOptional = Optional.ofNullable(null);
System.out.println(nullUserOptional.orElse(new User()));
}
orElseGet
如果存在值,则使用该值调用指定的使用者,否则提供一个调用者指定的值返回。(可以理解为没有值给定一个默认值)。
/**
* description Optional orElseGet 如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。(为null 则new 一个User)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void orElseGetTest() {
Optional<User> nullUserOptional = Optional.ofNullable(null);
System.out.println(nullUserOptional.orElseGet(User::new));
}
orElse和OrElseGet的区别:https://blog.csdn.net/Amandazh/article/details/117109855
orElseThrow
如果存在值,则使用该值调用指定的使用者,否则抛出由调用者创建的异常抛出。(可以理解为没有值抛出异常)。
/**
* description Optional orElseThrow 如果存在值,则使用该值调用指定的使用者,否则抛出由调用者创建的异常抛出。(可以理解为没有值抛出异常)
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void orElseThrowThrow() {
Optional<User> userOptional = Optional.ofNullable(initUser);
System.out.println(userOptional.orElseThrow(RuntimeException::new));
Optional<User> nullUserOptional = Optional.ofNullable(null);
nullUserOptional.orElseThrow(RuntimeException::new);
}
其他的一些操作
方法名称 | 作用 |
---|---|
filter | 过滤操作可参考Stream的filter方法 |
flatMap | 过滤操作可参考Stream的flatMap方法 |
isPresent | 判断Optional有值true无值false |
map | 过滤操作可参考Stream的map方法 |