繁体   English   中英

java-8可选的双重检查

[英]java-8 optional double checking

我喜欢java-8的可选提示样式。 所以我想检查double null。

class A {
    public String getSome() {
        return ""; // some string
    }
}

class B {
    public String getSome() {
        return ""; // some string
    }
}
class T {
    A a;
    B b;

    public String result() {
        if (a.getSome() != null) {
            if (b.getSome() != null) {
                return a+b;
            } else {
                throw new RuntimeException();
            }
        } else {
            throw new RuntimeException();
        }
    }
}

如何将T.result()转换为可选样式?

我尝试了这种样式,但是IDE告诉我“循环接口”。

public String result() {
        return Optional.ofNullable(a.getSome())
                .map(a -> {
                    return Optional.ofNullable(b.getSome())
                            .map(b -> {
                                return a + b;
                            })
                            .orElseThrow(RuntimeException::new);
                })
                .orElseThrow(RuntimeException::new);
    }

尽管@Eran提供了可能的解决方案,但我认为您不会通过使用链接和Optionals来增加简单性。

新的Java 8 API和功能不得替代所有Java 8之前的代码。 例如,有很多问题有关使用Stream执行某些任务,而简单的for循环可以解决问题。

在您的情况下,由于您只想检查引用是否为null ,只需执行以下操作:

public String result() {
    return Objects.requireNonNull(a.getSome()) + Objects.requireNonNull(b.getSome());   
}

这应该简单得多:

public String result() {
    return Optional.ofNullable(a.getSome()).orElseThrow(RuntimeException::new) +
           Optional.ofNullable(b.getSome()).orElseThrow(RuntimeException::new);
}

而且,如果将getSome方法更改为返回Optional<String> ,则结果方法将更加简单:

public String result() {
    return a.getSome().orElseThrow(RuntimeException::new) +
           b.getSome().orElseThrow(RuntimeException::new);
}

但是,如果ab本身可能为null ,则需要一些额外的代码来处理。

用所谓的“可选样式”重写方法将导致以下怪诞现象:

Optional.ofNullable(a.getSome())
  .flatMap(x -> 
    Optional.ofNullable(b.getSome()).map(x::concat)
  ).orElseThrow(RuntimeException::new)

您为什么要在世界上这样做? 您正在尝试解决不存在的问题。 请仅遵循ZouZou的建议并使用requireNonNull ,但是将每个requireNonNull放在单独的行中,以使堆栈跟踪更易于理解。

您的IDE抱怨的可能是您将ab既用作方法中的变量,又用作lambda中的参数名。 您不允许这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM