【问题标题】:Alternate way for nested ifs using Boolean in Java在 Java 中使用布尔值嵌套 ifs 的替代方法
【发布时间】:2017-09-19 08:43:16
【问题描述】:

我有下面的代码块

if(Objects.nonNull(isMine)) {
    if (isMine) {
             this.books= // gets it from the database;
    } else  {
            this. books= // gets it from the database
    }

 } else {
     this. books = // gets it from the database
 }

isMine - 是一个布尔对象 我尝试通过将 isMine 转换为如下字符串来使用 switch case

 String.valueOf(isMine) 

但是没有用。建议更好更快的方式在java中实现上述代码。

【问题讨论】:

  • 更快是什么意思?看起来不错。您可以通过反转空检查来更容易阅读(请参阅Flown的答案),但除此之外......
  • @Sam a Boolean(empasis 大写)可以为空
  • @Sam,因为有盒装版,你可以。
  • @Sam,如果他正在使用包装对象,则可以。
  • “但没用”是什么意思?更加详细一些。我看不出String.valueOf(isMine) 不应该工作的任何原因。除此之外,为什么你有一个条件呢?在所有情况下,您都在做同样的事情this. books= // gets it from the database...

标签: java if-statement collections java-8 switch-statement


【解决方案1】:

您可以使用 else if 来扁平化您的 if-else 语句:

if(isMine == null) {
  books = allList;
} else if(isMine) {
  books = myList;
} else {
  books = notMyList;
}

另一种方法是将检查分散到方法中:

  public List<Book> getBookList(Boolean isMine) {
    return isMine == null ? allList : getBookList(isMine.booleanValue());
  }

  public List<Book> getBookList(boolean isMine) {
    return isMine ? myList : notMyList;
  }

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用Optional

    Boolean isMine = null;
    String str = "";
    Optional<Boolean> optional = Optional.ofNullable(isMine);
    str = optional.map(i -> i ? "a" : "b").orElse("c");
    System.out.println(str);
    

    所以它会是这样的:

    this.books = optional.map(i -> i ? valForTrue : valForFalse).orElse(valForNull);
    

    【讨论】:

    • List&lt;Book&gt; books = Optional.ofNullable(isMine).map(v -&gt; v ? dbCallX() : dbCallY()).orElseGet(() -&gt; dbCallZ());
    【解决方案3】:

    this.books = isMine != null ? (isMine ? this.myList : this.notMyList) : this.allList;

    在三元运算符中使用ternary operator,例如

    【讨论】:

    • 这里保存的代码行真的不值得恶化的可读性。
    【解决方案4】:

    甚至不要考虑您的情况下的性能,那是微不足道的。

    您当前的方式看起来不错。你也有一个扁平化方式和嵌套三元的答案。

    如果您仍然想学习如何在这种情况下使用 switch(请不要将此代码投入生产。发帖是为了向您展示方法)

    使用String.valueOf(isMine)实现的正确方法是

    switch ( String.valueOf(isMine) ) {
            case "null":
                //TODO
                break;
            case "true":
                //TODO
                break;
            case "false":
                //TODO
            break;
            }
    

    【讨论】:

      【解决方案5】:

      通过 vavr.io 提供的模式匹配,它可以变得非常干净:

      List<Books> output = Match(input).of(
              Case($(true), dbCallX()),
              Case($(false), dbCallY()),
              Case($(), dbCallZ()));
      

      【讨论】:

        猜你喜欢
        • 2020-06-03
        • 1970-01-01
        • 2021-09-19
        • 2015-06-17
        • 2015-02-22
        • 2022-12-31
        • 2013-04-02
        • 1970-01-01
        • 2021-07-03
        相关资源
        最近更新 更多