本节我们讲一下Optional
的使用,Optional
主要用来对null
的处理,我们将常规需要判断null
的对象用Optional
包装起来。
Optional.of(value)
:value必须不能为空,
示例:Optional<String> firstName = Optional.of(person.getFirstName());
Optional.ofNullable(value):
value可以为空
示例:Optional<String> middleName = Optional.ofNullable(person.getMiddleName());
get()
T get()
:获得Optional中的对象包装的value
,T
为value
的类型.
示例:String firstNameGreetings = firstNameOptional.get()
isPresent()
boolean isPresent()
:判断Optional
中的value
是否存在,返回值是boolean.
示例:boolean isPresent = middleNameOptional.isPresent()
ifPresent
ifPresent(Consumer<? super T> consumer)
:如果Optional
中的value
存在,执行什么操作. 对比《函数式编程1-Lambda表达式》的Function
和BiFunction
,这里的Consumer<T>
接口接受一个入参T
类型,没有返回值.
示例:
firstNameOptional.ifPresent(name -> {
String firstNameGreetings = firstNameOptional.get().toUpperCase();
log.info("hello " + firstNameGreetings);
})
map()
Optional<U> map(Function<? super T, ? extends U> mapper)
: 对Optional
中的value
(类型为T)
进行处理并返回一个新的Optional<U>
,U
为返回值类型.
示例:
Optional<String> lastNameOptionalNew = lastNameOptional
.map(name -> name.toUpperCase());
orElse()
T orElse(T other)
:和get()
一样获得value
的值,区别是有value
的时候返回value
,没有value
的时候返回other
.
示例
String middleNameGreetings = middleNameOptional
.map(name -> name.toUpperCase())
.orElse("no middle name")
- Person
@Data
public class Person {
private String firstName;
private String middleName;
private String lastName;
}
@Bean
CommandLineRunner testOptional(){
return p -> {
Person person = new Person();
person.setFirstName("Will");
Optional<String> firstNameOptional = Optional.of(person.getFirstName());
firstNameOptional.ifPresent(name -> {
String firstNameGreetings = firstNameOptional.get().toUpperCase();
log.info("hello " + firstNameGreetings);
});
Optional<String> middleNameOptional = Optional.ofNullable(person.getMiddleName());
String middleNameGreetings = middleNameOptional
.map(name -> name.toUpperCase())
.orElse("no middle name");
log.info("hello " + middleNameGreetings);
log.info(new Boolean(middleNameOptional.isPresent()).toString());
person.setLastName("Smith");
Optional<String> lastNameOptional = Optional.ofNullable(person.getLastName());
Optional<String> lastNameOptionalNew = lastNameOptional
.map(name -> name.toUpperCase());
log.info("hello " + lastNameOptionalNew.get());
};
}