Java中的Optional使用
下文笔者将详细讲述java中Optional对象,如下所示
Optional对象的功能:
可使用最简化的代码,并高效的处理NPE(Null Pointer Exception空指针异常)
Optional对象的简介
Optional类是java为平时判断对象是否为空时使用
例:
jdk8以前的写法
User user = new User();
if (null == user){
return "user为null";
}
jdk8以后可采用以下写法
User user = new User();
return Optional.ofNullable(user).orElse("user为null");
Optional对象创建
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optEmpty = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optOf = Optional.of("optional");
// 3、创建包装对象值允许为空也可以不为空的Optional对象
Optional<String> optOfNullable1 = Optional.ofNullable(null);
Optional<String> optOfNullable2 = Optional.ofNullable("optional");
Optional.get()方法(返回对象的值)
get()方法是返回一个option的实例值
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
例:
User user = new User();
user.setAge(2);
Optional.ofNullable(person).get();
Optional.isPresent()方法(判读是否为空)
isPresent()方法就是会返回一个boolean类型值,如果对象不为空则为真,如果为空则false
public boolean isPresent() {
return value != null;
}
User user = new User();
user.setAge(2);
if (Optional.ofNullable(user).isPresent()){
//写不为空的逻辑
System.out.println("不为空");
}else{
//写为空的逻辑
System.out.println("为空");
}
Optional.ifPresent()方法(判读是否为空并返回函数)
如果对象非空,则运行函数体
public void ifPresent(Consumer<? super T> consumer) {
//如果value不为空,则运行accept方法体
if (value != null)
consumer.accept(value);
}
例:
User user = new User();
user.setAge(2);
Optional.ofNullable(user).ifPresent(p -> System.out.println("年龄"+p.getAge()));
如果对象不为空,则会打印这个年龄,因为内部已经做了NPE(非空判断),所以就不用担心空指针异常了
Optional.filter()方法(过滤对象)
filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
//如果为空直接返回this
if (!isPresent())
return this;
else
//判断返回本身还是空Optional
return predicate.test(value) ? this : empty();
}
例:
User user = new User();
user.setAge(2);
Optional.ofNullable(user).filter(p -> p.getAge()>50);
Optional.map()方法(对象进行二次包装)
map()方法将对应Funcation函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
//如果为空返回自己
if (!isPresent())
return empty();
else {
//否则返回用方法修饰过的Optional
return Optional.ofNullable(mapper.apply(value));
}
}
例
User user = new User();
user.setAge(2);
String optName = Optional.ofNullable(user).map(p -> user.getName()).orElse("name为空");
Optional.flatMap()方法(Optional对象进行二次包装)
map()方法将对应Optional< Funcation >函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
例
User user = new User();
user.setAge(2);
Optional<Object> optName = Optional.ofNullable(user).map(p -> Optional.ofNullable(p.getName()).orElse("name为空"));
Optional.orElse()方法(为空返回对象)
常用方法之一,这个方法意思是如果包装对象为空的话,就执行orElse方法里的value,如果非空,则返回写入对象
public T orElse(T other) {
//如果非空,返回value,如果为空,返回other
return value != null ? value : other;
}
例:
User user = new User();
user.setAge(2);
Optional.ofNullable(user).orElse(new User("java", 888));
Optional.orElseGet()方法(为空返回Supplier对象)
这个与orElse很相似,入参不一样,入参为Supplier对象,为空返回传入对象的.get()方法,如果非空则返回当前对象
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
例:
Optional<Supplier<User>> sup=Optional.ofNullable(User::new);
//调用get()方法,此时才会调用对象的构造方法,即获得到真正对象
Optional.ofNullable(user).orElseGet(sup.get());
Optional.orElseThrow()方法(为空返回异常)
如果为空,就抛出定义的异常
如果不为空返回当前对象
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
例:
User user = userService.selectByPhone(request.getPhone());
Optional.ofNullable(user).orElseThrow(() -> new ServiceException("没有查询的相关数据"));