MST

星途 面试题库

面试题:Java中Optional类在链式调用中的应用

假设有一个包含多层嵌套对象的场景,例如A对象包含B对象,B对象包含C对象,C对象有一个方法getInfo() 。使用Optional类实现从A对象开始,安全地调用C对象的getInfo()方法,如果其中任何一个对象为空则返回默认值。请编写代码示例并解释实现思路。
36.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.Optional;

class C {
    public String getInfo() {
        return "C's info";
    }
}

class B {
    private C c;

    public C getC() {
        return c;
    }
}

class A {
    private B b;

    public B getB() {
        return b;
    }
}

public class Main {
    public static void main(String[] args) {
        A a = new A();
        // 这里模拟a对象为空的情况
        // a = null;

        String result = Optional.ofNullable(a)
               .map(A::getB)
               .map(B::getC)
               .map(C::getInfo)
               .orElse("default value");

        System.out.println(result);
    }
}

实现思路

  1. 使用Optional.ofNullable包裹可能为空的A对象:这样做可以避免A对象为空时直接调用getB()方法抛出NullPointerException
  2. 使用map方法进行链式调用map方法会对Optional中包含的值应用给定的函数。在这里,依次通过map调用A对象的getB()方法、B对象的getC()方法和C对象的getInfo()方法。如果任何一个map操作中的对象为空(即Optional中不包含值),map操作会返回一个空的Optional,并不会抛出空指针异常。
  3. 使用orElse方法返回默认值:如果整个链式调用过程中任何一个对象为空,最终的Optional将不包含值,此时调用orElse方法会返回传入的默认值。这样就实现了安全调用多层嵌套对象的方法,并在对象为空时返回默认值。