Java8可选get(如果存在)

Java8可选get(如果存在),java,java-8,optional,Java,Java 8,Optional,我的班级结构如下: public class Foo { private FooB fooB; public Optional<FooB> getFooB() { return Optional.ofNullable(fooB); } } public class FooB { private String a; private String b; public String getA() { re

我的班级结构如下:

public class Foo {
    private FooB fooB;

    public Optional<FooB> getFooB() {
        return Optional.ofNullable(fooB);
    }
}

public class FooB {
    private String a;
    private String b;

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }
}
main() {
    //initialize a Foo object called foo
    String a = foo.getFooB().ifPresent(FooB::getA);
}
基本上,如果foo对象返回FooB作为present,则从
FooB
获取字段
stringa
,并将其存储在局部变量
stringa
中。如何在一行中优雅地执行此操作?

由于
getFooB()
返回了
可选的
实例,要获得
getA()
的相应值,需要使用如下方法:

String a = foo.getFooB().isPresent() ? foo.getFooB().get().getA() : {absolutely anything your heart desires if FooB doesn't exist};
Optional<String> a = foo.getFooB().map(FooB::getA);
可选a=foo.getFooB().map(FooB::getA);

问题是:如果
Optional
为空,您希望发生什么?这正是可选的:强迫您考虑这种情况。
ifPresent()
需要一个不能返回任何内容的消费者。虽然您可以为它提供一个有状态的使用者,但最好是阅读使用
map()
。您只需再次处理生成的
可选
字符串a=foo.getFooB().map(FooB::getA).orElse(null)这太可怕了。当可选项为空时,它假设OP希望有
null
。在我的编辑之后,它是否不那么可怕?否。对于.foo.getFooB().map(FooB::getA).orElse(/*OP想要的任何东西。*/),在
Optional
上有
map
操作;虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值-