【问题标题】:Java 8 Optional get if present [duplicate]Java 8可选获取(如果存在)[重复]
【发布时间】:2016-08-04 17:47:46
【问题描述】:

我有一个这样的类结构:

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 行中优雅地做到这一点?

【问题讨论】:

  • 问题是:如果Optional&lt;FooB&gt; 为空,你想发生什么?这正是 Optional 的用途:迫使您考虑这种情况。
  • ifPresent() 需要一个不能返回任何东西的消费者。虽然你可以给它一个有状态的消费者,但最好阅读使用map()。你只需要再次处理生成的Optional&lt;String&gt;String a = foo.getFooB().map(FooB::getA).orElse(null);

标签: java java-8 optional


【解决方案1】:

由于getFooB()返回一个Optional&lt;FooB&gt;的实例,要得到getA()的对应值,需要使用map方法作为next:

Optional<String> a = foo.getFooB().map(FooB::getA);

【讨论】:

    【解决方案2】:
    String a = foo.getFooB().isPresent() ? foo.getFooB().get().getA() : {absolutely anything your heart desires if FooB doesn't exist};
    

    【讨论】:

    • 这太可怕了。当 Optional 为空时,它假设 OP 希望拥有null
    • 经过我的编辑后是不是没那么可怕了?
    • 不。为此,Optional 上有 map 操作。
    • foo.getFooB().map(FooB::getA).orElse(/* OP想要什么。*/);
    • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。 - From Review
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2019-07-18
    • 2013-10-06
    相关资源
    最近更新 更多