java中的Optional(一)

Optional作用:主要解决空值针异常

空值针异常:指针:值得是存放的内存地址,空指针指的是当指针不指向任何内存地址时,就叫做空指针。当一个指针不指向任何内存地址,但是你还调用它了,这时候就会产生空指针的异常错误,举例:

int[] array = null; 
System.out.println(array[0]);

这个时候原本array数组是空指针,没有创建新的对象,再调用这个数的时候就会产生空指针异常的错误 ,程序运行显示Exception in thread "main" java.lang.NullPointerException?为什么会产生空指针:int[] array = null再内存中创建了一个叫做array的变量,在对内内存中并没有开辟int类型的数据空间,所以栈内存中的这个array变量没有存放任何内存地址,调用没有的东西显然会产生空指针

* Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
* Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
* Optional 类的引入很好的解决空指针异常
* Optional的构造方法都是被private修饰,所以不能使用new方法创建对象

创建Optional的三个实例:

1.empty():创建一个包含对象值为空的Optional类对象,获取创建的Optional对象中的值会报错

/*static <T> Optional<T> empty():返回空的Optional实例*/

 2.of(T value):创建对象值非空的Optional类对象,如果将null值传递进去,会报错

/*static <T> Optional<T> of(T value)
返回一个指定非null值的Optional。*/

3.ofNullable(对象参数):创建一个对象值可以包含空值(null)的Optional类对象,所以不清楚对象是否为null时使用ofNullable

/*static <T> Optional<T> ofNullable(T value)
如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。*/

Optional类中的方法:

/* T get()
 如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException*/                                                         

/*boolean isPresent()
如果值存在则方法会返回true,否则返回 false。*/

/*void ifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。*/
/*T orElse(T other)
如果存在该值,返回值,否则返回 other。*/
/*T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值,否则触发 other,并返回 other 调用的结果。*/
/*<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常*/
/*Optional<T> filter(Predicate<? super <T> predicate)
如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional对象*/
/*<U>Optional<U> map(Function<? super T,? extends U> mapper)
如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果,如果为空,最终结果返回一个空的Optional对象,并不会报错*/
/*<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional*/
/*String toString()
返回一个Optional的非空字符串,用来调试*/
@Test
    void tes1(){
        Optional<String> optionalS = Optional.of("张三");//参数传递null会发生空值针异常
        Optional.ofNullable(null);
        Optional<Object> opt = Optional.empty();
        System.out.println(opt.isPresent());
    }
 @Test
    void test2(){
        Integer value1 = null;
        Integer value2 = new Integer(10);
        /*static <T> Optional<T> ofNullable(T value)
        如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
        重点:允许传递为null参数*/
        Optional<Integer> a = Optional.ofNullable(value1);
        Optional<Integer> b = Optional.ofNullable(value2);
        /*boolean isPresent()如果值存在则方法会返回true,否则返回 false。*/
        System.out.println(a.isPresent());//false 表示Optional中包含的指定值为空
        System.out.println(b.isPresent());//true 表示OPtional中包含非空指定值
        System.out.println(a);//Optional.empty
        System.out.println(b);//Optional[10]

        /*T orElse(T other)如果存在该值,返回值,否则返回 other。*/
        Integer or1 = a.orElse(new Integer(0));//0  由于a是空的Optional,所以返回的new Integer(0)
        /* T get()
        如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException*/
        Integer or2 = b.get();//10
        Integer or3 = b.orElse(new Integer(1));//10 b是包含指定值的Optional对象,所以返回包含的指定值
        System.out.println(or1);//0
        System.out.println(or2);//10
        System.out.println(or3);//10
        System.out.println(or1+or2);//10
    }

    @Test
    void test3(){
        /*Stream的findFirst方法在此流中查找第一个元素作为Optional。
        * 如果流中没有元素,findFirst返回空的Optional。如果流没有顺序,那么findFirst可以选择任何元素。
           如果findFirst选择的元素为null,它将抛出NullPointerException*/
        ArrayList<String> list = new ArrayList<>();
        list.add(0,"小伙汁");
        list.add(1,"孙悟空");
        list.add(2,"猪八戒");
        list.add(3,"白龙马");
        list.add(4,"唐三藏");
        list.add(5,"沙和尚");
        Optional<String> dto = list.stream().findFirst();
        if (dto.isPresent()){
            System.out.println(dto.get());
        }
        System.out.println(dto.toString());
    }
    @Test
    void test4(){
        String name = "abcd";
        StringBuilder reverse = new StringBuilder(name).reverse();
        System.out.println(reverse);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值