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
操作;虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值-