Java8 Optional 方法简介

目录

知悉:

三个主要方法:

(1)Optional.of()

(2)Optional.ofnullable()

(3)Optional.empty()

另:


知悉:

Java8为解决null值判断问题,引入Optional类。

本类可以避免显式的null值判断(null的防御性检查),避免null值导致的空指针异常(NPE:NullPointException);

三个主要方法:

三个方法,建议尽可能使用Optional.ofnullable()

(1)Optional.of()

将数据 转换成 Optional类型(获取具有指定类型的指定值的Optional类的实例)
可通过 .get()方法 获取原值

    @Test
    public void testOptionalOf() {

        Optional<String> emptyStr = Optional.of("");
        System.out.println(emptyStr);   // 输出:Optional[]

        Optional<String> str = Optional.of("abc");
        System.out.println(str);        // 输出:Optional[abc]

        Optional<Integer> integer = Optional.of(123);
        System.out.println(integer);    // 输出:Optional[123]

        Optional<String> optional = Optional.of("哦吼");
        System.out.println(optional);   // 输出:Optional[哦吼]

        Optional<Object> o = Optional.of(null);
        System.out.println(o);          // 报错:空指针异常
    }

源码:

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

应用场景:

  1. 非常明确 将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时
    比如obj是一个刚new出来的对象,或者是一个非null常量。
     
  2. 想为 obj 断言非 null 时
    比如 想要 obj 一旦为 null 就立即报告 NullPointerException 异常, 而不是隐藏

(2)Optional.ofnullable()

功能与Optional.of()相同,底层也应用了Optional.of()方法。
但是对 null 类型进行了判断,如果为null,则方法内部会 通过 Optional.empty()方法重新 new 一个新的空的 Optional进行返回。

    @Test
    public void testOptionalOfNullable() {
        Optional<String> emptyStr = Optional.ofNullable("");
        System.out.println(emptyStr);   // 输出:Optional[]

        Optional<String> str = Optional.ofNullable("abc");
        System.out.println(str);        // 输出:Optional[abc]

        Optional<Integer> integer = Optional.ofNullable(123);
        System.out.println(integer);    // 输出:Optional[123]

        Optional<String> optional = Optional.ofNullable("哦吼");
        System.out.println(optional);   // 输出:Optional[哦吼]

        Optional<Object> o = Optional.ofNullable(null);
        System.out.println(o);          // 输出:Optional.empty
    }

源码如下:

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }


    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    private static final Optional<?> EMPTY = new Optional<>();

(3)Optional.empty()

重新new一个Optional(),并返回。

    @Test
    public void testOptionalEmpty() {
        Optional<Object> empty = Optional.empty();
        System.out.println(empty);      // 输出:Optional.empty
    }

源码如下

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    private static final Optional<?> EMPTY = new Optional<>();

另:

部分stream流的返回值,其实也是Optional。如:


    /**
     * integer Comparator 对比 获取最大值
     */
    @Test
    public void testMaxInt() {

        // 1、自定义排序
        Optional<Integer> max2 = intList.stream().max(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        // 简化
        Optional<Integer> max3 = intList.stream().max((o1, o2) -> o1.compareTo(o2));
        // 自然排序
        Optional<Integer> max = intList.stream().max(Integer::compareTo);
        System.out.println("自然排序的最大值:" + max.get());
        System.out.println("自定义排序的最大值:" + max2.get());
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值