Optional

Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)。

本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。

具体用法

 

public class Optional_example {

    public static void main(String[] args) throws Exception {
        //of: 为非null的值创建一个Optional。如果传入参数为null,则抛出NullPointerException
        Optional<String> name = Optional.of("123");

        //ofNullable: 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
        Optional<Object> empty = Optional.ofNullable(null);

        //empty: 一个空的Optional
        Optional<Object> empty1 = Optional.empty();

        //get: 如果Optional有值则将其返回,否则抛出NoSuchElementException
        empty.get();

        //isPresent: 如果值存在返回true,否则返回false
        name.isPresent();

        //ifPresent: 如果Optional实例有值则为其调用consumer,否则不做处理
        name.ifPresent(x -> {
            x = x + "456";
        });

        //orElse: 如果有值则将其返回,否则返回指定的其它值
        name.orElse("默认数据");
        empty.orElse(123);

        //orElseGet: 类似orElse;可以接受一个lambda表达式生成默认值
        name.orElseGet(() -> "默认数据");
        empty.orElseGet(() -> 123);

        //orElseThrow: 如果有值则将其返回,否则抛出异常
        empty.orElseThrow(Exception::new);

        //map: 如果有值,则对其执行函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional
        name.map(x -> x.toUpperCase());

        //latMap: 如果有值,为其执行函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装
        name.flatMap(x -> Optional.of(x.toUpperCase()));

        //filter: 如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional
        name.filter(x -> x.length() > 2).map(x -> x.toUpperCase());

        //使用Optional与Stream取代if判空逻辑
        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple("red", 170));
        appleList.add(new Apple("green", 150));
        appleList.add(null);
        appleList.add(new Apple("yellow", 170));
        appleList.add(new Apple("green", 170));
        appleList.add(new Apple("red", 170));

        //例子: 先判断appleList是否为空,如果为空则返回空list;不为空则过滤元素为空,再过滤color是green的,再找到第一个green元素返回
        //最后用orElse来获取可以避免空指针异常
        Apple apple = Optional.ofNullable(appleList).orElseGet(() -> {
            return new ArrayList<>();
        }).stream().filter(Objects::nonNull).filter(x -> "green".equals(x.getColor())).findFirst().orElse(null);
        System.out.println(apple);

    }


}

 

posted @ 2020-10-12 18:36  柒月丶  阅读(542)  评论(0)    收藏  举报