java8 Optional 包装类

一. 概述Optional

Optional 是一个容器类,在java.util.Optional,可以保持类型T的值,并且可以很好的处理空指针问题,例如调用isPresent()方法如果有值的话返回true,调用get()返回包装到T对象,调用orElse()方法返回数据,如果没有返回一个预先设置的对象,调用orElseThrow()如果有值则返回,如果没有值则跑出异常等

二. Optional使用

1. 方法概述

在这里插入图片描述

2. 代码示例

 	@Test
    public void test7(){

        //创建Option对象

        //1.Optional.of(T t) 创建一个Optional 实例,t必须非空
        //注意在调用of()静态方法创建Option对象时,若方法中的数据对象为空会跑出异常
        Persion persion1 = new Persion();
        Optional<Persion> perOptional1 = Optional.of(persion1);
        Persion persion2 = null;
        //2.Optional.ofNullable(T t) 创建一个Optional实例,方法中的t允许为空
        //(在不知道是否真实存在的时候使用)
        Optional<Persion> perOptional2 = Optional.ofNullable(persion2);

        //3.Option.empty() 创建一个空的Optional实例
        Optional emptyOption = Optional.empty();


        //判断Optional中是否存在数据
        //isPresent(); 存在返回true,
        Boolean b = perOptional1.isPresent();
        System.out.println(b);

        //ifPresent(Consumer<? super T> customer)
        //该方法中传递了一个Consumer函数式接口,若调用该方法的Optional
        //实例中对象数据真实存在则实现Consumer的方法体
        perOptional1.ifPresent(p -> p.setName("小明"));
        System.out.println(persion1.getName());


        //在Optional实例中获取对象数据
        //1.get() 若调用该方法的Optional实例中的对象数据为空则会抛出异常
        Persion p = perOptional1.get();

        //2.orElse(T other) 如果调用该方法的Optional实例中有则返回,如果没有,则使用方法中传递的这个other
        Persion p2 = perOptional2.orElse(new Persion("小红",22,3500.00));
        System.out.println(p2.getName());

        //3.orElseGet(Supplier<? extends T> other); 如果有值则返回,
        //否则返回有Supplier函数式接口提供的对象
        //perOptional2.orElseGet(Supplier函数式接口提供的对象);

        //4.or ElseThrow(supplier<? extends X> exceptionSupplier);如果有值则返回,
        //否则由Supplier函数式接口抛出异常(可以抛出自定义异常)
        perOptional2.orElseThrow( () -> new NullPointerException());
    }

Optional的 map(), flatMap(), filter(), 集合遍历等

@Test
    public void test8() {
        Persion persion = new Persion("小明", 22, 2000.00);
        //Optional通过map()方法,获取数据
        Optional.ofNullable(persion).map(p -> p.getName()).orElse("[email protected]");

        //flatMap()
        //分析Optional实例调用 Optional<T> map(Function<T> f)方法,返回的是一个包含数据的Optional对象
        //假设传递给map方法中的数据本身就是一个Optional<Optional<T>>
        //这时map和flatMap的用法就清楚,如果某对象实例的属性本身就为Optional包装过的类型,
        //那么就要使用flatMap方法,假设p.getName()返回的就是Optional<Persion>类型的,所以不用再使用Optional进行包装,


        //过滤 filter() 接收一个Predicate函数式接口类型
        Optional<Persion> optPersion = Optional.ofNullable(persion)
                .filter( p -> p.getName() != null);


        //Optional 集合遍历
        List<Persion> persionList = new ArrayList<>();

        
        persionList.add(new Persion("小强", 40, 3500.00));
        persionList.add(new Persion("小黑", 22, 2200.00));
        persionList.add(new Persion("小花", 27, 2000.00));
        persionList.add(new Persion("bb", 16, 1500.00));
        persionList.add(new Persion("小明", 22, 2000.00));

        List<Persion> pList2 = new ArrayList<>();
        Optional.ofNullable(persionList).orElse(new ArrayList<>()).forEach(p -> {
            if(p.getSalary()>2500) {
                pList2.add(p);
                System.out.println(p.getSalary());
            }
        });
    }
发布了22 篇原创文章 · 获赞 0 · 访问量 198

猜你喜欢

转载自blog.csdn.net/qq_29799655/article/details/104743231