2016-08-04 43 views
2

我有一个类的结构是这样的:的Java 8可选得到,如果现在

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为存在然后从FooB获取字段String a并将其存储在本地变量String a中。我怎样才能做到这一点在1线优雅?

+5

的问题是:你想发生,如果什么'可选'是空的?这正是可选的目的:迫使你考虑这种情况。 – Tunaki

+1

'ifPresent()'需要一个不能返回任何东西的消费者。虽然你可以给它一个有状态的消费者,但最好使用'map()'来阅读。你只需要再次处理产生的'Optional ':'String a = foo.getFooB().map(FooB :: getA).orElse(null);' – eckes

回答

6

由于getFooB()返回Optional<FooB>一个实例,得到的getA()相应的值,你需要使用map方法,下一个:

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

这太可怕了。并且假定OP在“可选”为空时想要“空”。 – Tunaki

+0

编辑后是不是很可怕? –

+0

没有。对于''Optional',有'map'操作。 – Tunaki