如何检查java中的两个参数其中之一为空还是两者都为空

Dav*_*ady 7 java string

我想验证以下条件,但我的 if 条件出了问题并返回无效结果。我的验证是: 要么productIdproductAltID可以具有值,或者两者都可以null 如果 和productIdproductAltID为空,则productSellDateproductReturnDate必须具有值。

如果productSellDateproductReturnDatenull,那么productIdproductAltID应该有价值。

请在下面找到我的代码,我得到了不正确的结果,不确定我在这里搞砸了什么:

public class validate {

    public static void main(String[] args) {

        String productId = null;
        String productAltID = "adfafadsf";
        Date productSellDate = null;
        Date productReturnDate = new Date();

        if (productId != null || productAltID != null || productSellDate !=null && productReturnDate != null) {
            System.out.println("validation success");
        } else {
            System.out.println("validation failed");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

// 有效场景

Combination 1: Valid Scenario
        String productId = null;
        String productAltID = null;
        Date productSellDate = new Date();
        Date productReturnDate = new Date();


Combination 2: Valid Scenario
        String productId = null;
        String productAltID = "3432fefsf";
        Date productSellDate = new Date();
        Date productReturnDate = new Date();

Combination 3: Valid Scenario
        String productId = "sdf3234234324";
        String productAltID = "3432fefsf";
        Date productSellDate = null;
        Date productReturnDate = null;

Combination 4: Valid Scenario
        String productId = null;
        String productAltID = "3432fefsf";
        Date productSellDate = null;
        Date productReturnDate = null;
Run Code Online (Sandbox Code Playgroud)

dre*_*our 5

如前所述,运算符绑定得更紧,因此逻辑没有按照您希望的方式执行请参阅Oracle 教程的运算符页面。&&||

一点点文学编程对于避免此类事情大有帮助。

boolean hasAnId = productId != null || productAltID != null;
boolean hasDates = productSellDate != null && productReturnDate != null;
if ( hasAnId || hasDates ) ...
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 4

太长了;博士

\n

drekbour 的答案是正确的,运算符优先规则和缺少括号意味着您||&&运算符的执行顺序与您的预期不同。

\n

这是另一种方法,使用Objects.nonNull和 流以可读的格式执行您想要的逻辑。

\n
Stream\n.of( productId , productAltID )\n.anyMatch( Objects :: nonNull )              // One or more ID fields have a value.\n||                                           // \xe2\x80\xa6 or \xe2\x80\xa6\nStream\n.of( productSellDate , productReturnDate )\n.allMatch( Objects :: nonNull )              // All dates have a value.\n
Run Code Online (Sandbox Code Playgroud)\n

细节

\n

Objects.nonNull

\n

通过 drekbour修改代码,我建议使用Objects.nonNull&Objects.isNull以便于阅读。

\n

另外,我会使用更具描述性的变量命名。

\n
boolean atLeastOneIdHasValue = Objects.nonNull( productId ) || Objects.nonNull( productAltID ) ;  // One or both ID fields have a value.\nboolean bothDatesHaveValue = Objects.nonNull( productSellDate ) && Objects.nonNull( productReturnDate ) ;  // Both dates have a value.\nboolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

\n

另一种方法使用

\n

创建变量流:

\n
Stream.of( productId , productAltID )\n
Run Code Online (Sandbox Code Playgroud)\n

然后统计是否有任何或全部符合我们的标准。

\n
    \n
  • 调用Stream#anyMatch以查看该流的任何元素是否与提供的谓词匹配。
  • \n
  • 调用Stream#allMatch以查看该流的所有元素是否与提供的谓词匹配。
  • \n
\n

在我们的例子中,谓词只是对 的调用Objects.nonNull

\n
Stream.of( productId , productAltID )\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以通过使用方法引用作为我们的谓词来缩短该代码: Objects :: nonNull

\n
boolean atLeastOneIdHasValue = Stream.of( productId , productAltID ).anyMatch( x -> Objects.nonNull( x ) ) ;  // One or more ID fields have a value.\nboolean bothDatesHaveValue = Stream.of( productSellDate , productReturnDate ).allMatch( x -> Objects.nonNull( x ) ) ;  // All dates have a value.\nboolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅在 IdeOne.com 上实时运行的代码

\n
\n

避免Date上课

\n

顺便说一句,永远不要使用Dateclass、nor CalendarSimpleDateFormat、等。这些现在已经成为遗留问题,是多年前被 JSR 310 中定义的现代java.timeTimestamp类取代的可怕日期时间类的一部分。

\n
    \n
  • 对于仅日期(年月日),请使用LocalDate.
  • \n
  • 对于 UTC 中的某个时刻(零小时-分钟-秒的偏移量),请使用Instant.
  • \n
  • 对于在特定时区看到的某个时刻,请使用ZonedDateTime
  • \n
\n