Java-Optional类看完这遍你就全懂了

Java-Optional类型


前言

在我们开发的过程中一不小心就会写下bug造成空指针异常,是不是很头痛呢。而Optional 类的引入可以很好的解决空指针异常,Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。


一、如何使用Optional?

使用optional的关键在于在值不存在的情况下产出一个可替代物,而只有在值存在情况下才会使用这个值。

如下示例会res为demo会打印出他的值“demo”,resEmpty为null值,会打印出设置的默认值“default”

		Optional<String> optional = Optional.of("demo");
        Optional<String> optionalEmpty = Optional.empty();
        //optional存在就返回optional的值否值就返回默认值
        String res =optional.orElse("default");
        String resEmpty =optionalEmpty.orElse("default");
        System.out.println(res);
        System.out.println(resEmpty);

在这里插入图片描述
还可以通过以下方式设置默认值和在为空的情况抛出异常

        //通过调用代码来计算默认值
        String result =optionalEmpty.orElseGet(()->Locale.getDefault().getDisplayName());
        //在没有值的情况下抛出异常
        String result2 =optionalEmpty.orElseThrow(IllegalAccessError::new);

二、不合适使用optional值的方式

参考以下代码你感觉哪个更简洁一些呢,结果很明显

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class StreamTest {
    public static void main(String[] args){
        List<StreamTest> testList =Arrays.asList(new StreamTest(), null);
        for (StreamTest test : testList) {
            //直接判断是否为空
            if(test!=null){
                test.hello();
            }
            //使用optional包装在判断
            if(Optional.ofNullable(test).isPresent()){
                Optional.of(test).get().hello();
            }
        }
    }
    public void hello(){
        System.out.println("hello word ");
    }
}

三、Optional的创建

可以使用Optional.of()和Optional.empty()方法来创建Option对象,使用of方法传入null会报NullPointerException异常,可以使用Optional.ofNullable()方法,他会判断传入的是否为null,如果为null则会调用Optional.empty()方法,否则调用Optional.of()

        Optional<String> s = Optional.of("wawa");
        Optional<String> s1 = Optional.empty();
        Optional<String> s2= Optional.ofNullable(null);

四、ifPresent的使用

ifPresent方法会接受一个函数,如果值存在那么他会被传递给该函数,否值不会发生任何事情

如下示例第一个foreach打印的结果为smailnullnullSky,而第二个使用ifPresent打印的结果为smailSky

        List<String> words = Arrays.asList("smail",null,null,"Sky");
        //ifPresent方法会接受一个函数,如果值存在那么他会被传递给该函数,否值不会发生任何事情
        words.forEach(System.out::print);
        System.out.println();
        words.forEach(x->Optional.ofNullable(x).ifPresent(System.out::print));

在这里插入图片描述

五、使用flatMap来构建Optional值的函数

该类中有一个inverse方法获取某个数的倒数,squareRoot获取某个值的平方根,以下展示普通的求一个数的倒数的平方根和使用flapMap的两种方法

import java.util.Optional;

public class StreamTest {
    public static void main(String[] args){
      //求一个值的倒数的平方根
        // 正常情况下我们先调用inverse方法获取倒数
        Optional<Double> inverse = StreamTest.inverse(2.0);
        Optional<Double> squareRoot = StreamTest.squareRoot(inverse.get());
        System.out.println(squareRoot.get());

        //通过使用flatMap我们可以直接
        Optional<Double> result = StreamTest.inverse(2.0).flatMap(StreamTest::squareRoot);
        System.out.println(result.get());

    }
    
    /**
     * 获取值的倒数
     * @param x 值
     * @return 倒数
     */
    public static Optional<Double> inverse(Double x) {
        return x == 0 ? Optional.empty() : Optional.of(1 / x);
    }

    /**
     * 获取x的平方
     * @param x 值
     * @return 倒数
     */
    public static Optional<Double> squareRoot(Double x) {
        return x == 0 ? Optional.empty() : Optional.of(Math.sqrt(x));
    }
    
}


版权声明:本文为s13073660520原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。