jdk1.8 Optional使用

参考文档
https://blog.csdn.net/L_Sail/article/details/78868673 

调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题。

新版本的Java,比如Java 8引入了一个新的Optional类。Optional类的Javadoc描述如下:

这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

API介绍

of

为非null的值创建一个Optional。

of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。


ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况。示例如下:


empty

一个空的Optional。


isPresent

如果值存在返回true,否则返回false。


get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

 

ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理,通过ifPresent修改的值,再次通过get获取的时候不会改变

 

orElse

如果有值则将其返回,否则返回指定的其它值。

如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。

 

orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。

 

orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。

 

map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。


代码示例

package cn.taobao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class ah {
    public static void main(String[] args) {

        //调用工厂方法创建Optional实例
        Optional<String> s1 = Optional.of("小明");
        //传入参数为null,抛出NullPointerException.
        // Optional<String> someNull = Optional.of(null);

        //下面创建了一个不包含任何值的Optional实例
        //例如,值为'null'
        Optional empty_1 = Optional.ofNullable(null);

        Optional<String> empty_2 = Optional.empty();

        //true
        System.out.println(empty_1.equals(empty_2));

        //isPresent方法用来检查Optional实例中是否包含值
        //小明
        if (s1.isPresent()) {
            //在Optional实例内调用get()返回已存在的值
            System.out.println(s1.get());
        }

        //hello 小明
        s1.ifPresent(new Consumer<String>() {
            @Override
            public void accept(String s) {
                s="hello "+s;
                System.out.println(s);
            }
        });

        //空
        Object kong = empty_1.orElse("空");
        System.out.println(kong);

        //小明
        String kong1 = s1.orElse("kong");
        System.out.println(kong1);

        //又是空
        Object o = empty_1.orElseGet(new Supplier() {
            @Override
            public Object get() {
                return "又是空";
            }
        });
        System.out.println(o);

        //小明
        String s = s1.orElseGet(() -> "我不是空");
        System.out.println(s);

        /*
        演示map
         */
        List<Integer> list_1 = Arrays.asList(1, 3, 5, 7, 9);
        Optional<List<Integer>> optionalList_1 = Optional.ofNullable(list_1);
        Optional<ArrayList<Integer>> optionalList_2 = optionalList_1.map(xx -> {
            ArrayList<Integer> objects = new ArrayList<>();
            for (int i = 0; i < xx.size(); i++) {
                objects.add(xx.get(i) * 2);
            }
            return objects;
        });
        ArrayList<Integer> list_2 = optionalList_2.get();
        //[2, 6, 10, 14, 18]
        System.out.println(list_2);
    }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值