Java — Optional 类(java.util.Optional<T>)

  • Post author:
  • Post category:java


小编之前开发java的时候,经常遇到空指针问题,做if判断来避免抛出异常。现在有 Optional类,可以不用那么麻烦了。

Optional 类是可以为 null 的容器对象,如果值存在,则 isPresent() 方法返回 true, 调用 get() 方法会返回该对象。Optional 类的引入很好的解决了空指针异常。

下面展示一下具体怎么使用 Optional类:

/**
 * @author: 80318030
 * @description:
 * @date: 2022/3/23
 **/
public class OptionalTest {

	//定义对象的成员变量
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
    	//声明对象
        OptionalTest optionalTest1 = new OptionalTest();
        //声明null
        OptionalTest optionalTest2 = null;

		//调用对象方法
		System.out.println("====optionalTest1 name: " + optionalTest1.getName());
        System.out.println("====optionalTest2 name: " + optionalTest2.getName());
    }
}

输出: 可以看到,调用 optionalTest2时候,抛出了空指针异常。

"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe"
====optionalTest1 name: null
Exception in thread "main" java.lang.NullPointerException
	at OptionalTest.main(OptionalTest.java:36)

Process finished with exit code 1

为了避免这种情况,引入Optional类的使用:

    public static void main(String[] args) {
        OptionalTest optionalTest1 = new OptionalTest();
        OptionalTest optionalTest2 = null;

		// ofNullable 允许参数为Null
        Optional<OptionalTest> test1 = Optional.ofNullable(optionalTest1);
        Optional<OptionalTest> test2 = Optional.ofNullable(optionalTest2);

		// isPresent 返回对象是否存在
        System.out.println("====optionalTest1 是否存在: " + test1.isPresent());
        System.out.println("====optionalTest1: " + optionalTest1.getName());

        System.out.println("====optionalTest2 是否存在: " + test2.isPresent());
        //orElse做判断,如果对象不存在,则返回默认值,即 new OptionalTest(),继续getName
        System.out.println("====optionalTest2 orElse: " + test2.orElse(new OptionalTest()).getName());
        //对象不存在时候,直接getName。会抛出异常,可见下面的输出
        System.out.println("====optionalTest2 get: " + test2.get().getName());
    }

输出:

"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe"
====optionalTest1 是否存在: true
====optionalTest1: null
====optionalTest2 是否存在: false
====optionalTest2 orElse: null
Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at OptionalTest.main(OptionalTest.java:33)

Process finished with exit code 1



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