【问题标题】:Setting String value from either one object field从任一对象字段设置字符串值
【发布时间】:2020-04-08 04:09:16
【问题描述】:

如何让我的代码看起来更好?

如果存在,我想将 String Name 设置为 ob1j.getX().getXX().getName(),否则我会将 name 设置为 obj1.getY().getYY().getYYY().getName( )。我也在使用 Optional 来执行空检查。

这是正确的做法吗?

我使用的是 JDK8,所以 'ifPresentOrElse' 不是一个选项。

String Name = null;

Optional<String> optA = Optional.ofNullable(obj1.getX())
        .map(a -> a.getXX())
        .map(b -> b.getName())

if (optA.isPresent()) {
    name = optA.get();
} else {
    Optional<String> optB = Optional.ofNullable(obj1.getY())
        .map(a -> a.getYY())
        .map(b -> b.getYYY())
        .map(c -> c.getName())
    if (optB.isPresent()) {
        name = optB.get();
    }
}

【问题讨论】:

  • 你可以使用 ifPresent 方法来代替 Opt.ifPresent((name) -> // 随便你 name=Opt.get())

标签: java java-8 nullpointerexception optional


【解决方案1】:

你可以这样做:

name = Stream.of(
         Optional.ofNullable(obj1.getX()).map(X::getXX).map(XX::getName),
         Optional.ofNullable(obj1.getY()).map(Y::getYY).map(YY::getYYY).map(YYY::getName)
    )
     .filter(Optional::isPresent)
     .map(Optional::get)
     .findFirst().orElse(null);

或者对于惰性处理,您可以像这样使用Supplier

List<Supplier<Optional<String>>> suppliers =Arrays.asList(
            () -> Optional.ofNullable(obj1.getX()).map(X::getXX).map(XX::getName),
  () -> Optional.ofNullable(obj1.getY()).map(Y::getYY).map(YY::getYYY).map(YYY::getName));

name = suppliers.stream()
            .map(Supplier::get)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .findFirst().orElse(null);

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多