一文让你彻底了解java中Optional对象


转自:

http://www.java265.com/JavaCourse/202204/2854.html

下文笔者将详细讲述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("没有查询的相关数据"));

原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/275057.html

(0)
上一篇 2022年7月18日
下一篇 2022年7月18日

相关推荐

发表回复

登录后才能评论