java8 Optional<T>简介

Laughing
2021-08-29 / 0 评论 / 1,007 阅读 / 搜一下 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月16日,已超过384天没有更新,若内容或图片失效,请留言反馈。

Optional<T>是Java8增加的一个用于处理NullPointException异常的类。
Optional<T>是一个容器类,代表一个值存在或不存在。如果用过Spring Boot Data Jpa,会发现里面好多返回值都是Optional<T>类型的。
下面我们介绍一下Optional<T>类的常见使用方法。
作为演示,我们创建了一个Dish类,代码如下:

public class Dish {

    /**
     * 构造函数
     * @param name 名称
     * @param isVegetarian 是否蔬菜
     */
    public Dish(String name, boolean isVegetarian) {
        this.name = name;
        this.isVegetarian = isVegetarian;
    }

    /**
     * 名称
     */
    private String name;

    /**
     * 是否蔬菜
     */
    private boolean isVegetarian;

    @Override
    public String toString(){
        return name;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isVegetarian() {
        return isVegetarian;
    }


    public void setVegetarian(boolean isVegetarian) {
        this.isVegetarian = isVegetarian;
    }
    
}

创建一个Optional<T>实例

创建Optional<T>实例,有两个方法,分别是ofofNullableofNullable与是of的区别在于,如果传递的参数是null,那么会创建一个空的(empty)Optional<T>实例。

 Optional<Dish> dishOptionalofNullable = Optional.ofNullable(null);
        dishOptionalofNullable.ifPresent(System.out::println);
        System.out.println("准备输出of方法的值");
        Optional<Dish> dishOptionalof = Optional.of(null);
        dishOptionalof.ifPresent(System.out::println);

运行代码,我们可以看到如下输出
我们可以看到ofNullable创建的实例,即使传递的参数是null调用实例方法时,系统也会抛出异常,而of传递null值时,创建的Optional<T>实例也是null

判断是否为空

通过isPresent()方法可以判断Optional<T>包含的类是否是null。返回true代表不是null,返回false代表是null

 Optional<Dish> emptyOptional = Optional.empty();
        if (emptyOptional.isPresent()) {
            System.out.println(emptyOptional.get());
        } else {
            System.out.println("empty optional");
        }

还有一个方法是ifPresent(Consumer<? super T> action)可以传递一个Consumer接口,当类不是null

 Optional<Dish> emptyOptional = Optional.empty();
        emptyOptional.ifPresent(System.out::println);

还有一个方法 ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction),当类不是null时,调用action接口,否则调用emptyAction接口。

 List<Dish> menu = new ArrayList<>();
        Dish fish = new Dish("鱼", false);
        Dish tomato = new Dish("西红柿", true);
        menu.add(fish);
        menu.add(tomato);
        menu.stream().filter(Dish::isVegetarian).findAny().ifPresentOrElse(System.out::println, () -> {
            System.out.println("没找到呢");
        });

获取值

获取值比较简单,通过get()方法即可。

 Optional<Dish> fishOptional = Optional.ofNullable(new Dish("鱼", false));
        if(fishOptional.isPresent()){
            System.out.println(fishOptional.get());
        }

通过orElse(T other)可以设置默认值。

 Optional<Dish> fishOptional = Optional.ofNullable(new Dish("鱼", false));
        Dish defaultDish = new Dish("default", false);
        if (fishOptional.isPresent()) {
            System.out.println(fishOptional.orElse(defaultDish));
        }
        Optional<Dish> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.orElse(defaultDish));

上面emptyOptional是空的,那么我们可以返回一个默认的Dish实例,下面看下控制台输出。
orElse(T other)还有一些变种方法,大家可以试一下。

0

评论 (0)

取消