Replacing repetitive get statement with Java 8 Optional

前端 未结 2 347
南笙
南笙 2021-01-18 19:30

I have a use case, where I have nested classes and an object of the top class. I want to get a value which is at the Nth level. I\'m using getters repetitively to achieve th

相关标签:
2条回答
  • 2021-01-18 19:50

    Use Optional with a series of map() calls for a nice one-liner:

    String getAValue(D d) {
       return Optional.ofNullable(d)
           .map(D::getC).map(C::getB).map(B::getA).map(A::getA1).orElse(null);
    }
    

    If anything is null along the chain, including d itself, the orElse() will execute.

    0 讨论(0)
  • 2021-01-18 19:54

    Wrap each nested class in an Optional:

    Class A {
        String a1;
    }
    Class B {
        Optional<A> a;
    }
    Class C {
        Optional<B> b;
    }
    Class D {
        Optional<C> c;
    }
    

    Then use flatMap and map to operate on these optional values:

    String a1 = d.flatMap(D::getC) // flatMap operates on Optional
                 .flatMap(C::getB) // flatMap also returns an Optional
                 .flatMap(B::getA) // that's why you can keep calling .flatMap()
                 .map(A::getA1)    // unwrap the value of a1, if any
                 .orElse("Something went wrong.") // in case anything fails
    

    You might want to check out the concept of Monads. And if you're feeling adventurous, Scala is too distant from Java.

    0 讨论(0)
提交回复
热议问题