在Java中检查属性是否为null或为空的最简单方法

时间:2019-05-10 07:17:18

标签: java java-8 java-stream

我有一个方法可以检查Account的某些属性(不是全部),并且如果这些属性中的任何一个为null或为空,它都会返回true,那么我需要一种优雅的方法来执行此操作,而不必编写太多条件语句。

private boolean isInvalidSlateAccount(Account account) {

    return (account.getAccesskeyid() == null || account.getAccesskeyid().trim().isEmpty()
            || account.getAccount() == null || account.getAccount().trim().isEmpty()
            || account.getAwsregion() == null || account.getAwsregion().trim().isEmpty()
            || account.getGatewayname() == null || account.getGatewayname().trim().isEmpty()
            || account.getGatewaytype() == null || account.getGatewaytype().trim().isEmpty()
            || account.getSecretaccesskey() == null || account.getSecretaccesskey().trim().isEmpty()
            || account.getTenant() == null || account.getTenant().trim().isEmpty() || account.getZone() == null || account
            .getZone().trim().isEmpty());

}

我已经做到了

private boolean isInvalidSlateAccount(Account account) {
    List<String> properties = Arrays.asList(
        account.getAccesskeyid(),
        account.getAccount(),
        account.getAwsregion(),
        account.getGatewayname(),
        account.getGatewaytype(),
        account.getSecretaccesskey(),
        account.getTenant(),
        account.getZone()
    );
    return properties.stream()
        .anyMatch(s -> (s == null || s.trim().isEmpty()));

}

但这将检查我不打算执行的Account对象的所有属性的条件。怎样才能更优雅地实现?

2 个答案:

答案 0 :(得分:4)

写一个方法isNullOrEmpty(String)

static boolean isNullOrEmpty(String s) {
  return s == null || s.trim().isEmpty()
  // Or return s == null || s.isBlank(); in Java 11+
}

所以您可以写:

return isNullOrEmpty(account.getAccesskeyid())
    || isNullOrEmpty(account.getAccount())
    /* etc */;

我认为这样做比做涉及构造流或列表的操作更可取,因为它只是简单:它使用了非常基础的语言功能,即使是新手程序员也很容易理解。

此外,它避免了评估所有字段(例如,将String... ss传递到isNullOrEmpty,然后在数组上执行某些操作),因为它会短路,因为它将尽快停止它会找到第一个null或空字符串。

它也不需要创建任何对象(例如隐式数组,或者在List情况下创建Arrays.asList(...)),这些对象仅仅是调用方法的伪像:trim()可能创建对象,但这是“有用的”工作,因为这对于评估条件是必需的。

答案 1 :(得分:0)

这似乎是标准Java Bean验证框架JSR 380的经典用例。

它允许您向Account类中的字段添加@NotNull注释。然后,您可以执行以下操作:

@NotNull
private String awsRegion;
Account account = new Account();
account.setAwsRegion(null)

Set<ConstraintViolation<Account>> violations = validator.validate(Account);

您需要添加验证API作为依赖项,以及验证程序实现,例如Hibernate参考实现:

<!-- Java eXtensions for Validation API -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

<!-- Java eXtensions for Unified Expression Language API -->
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
</dependency>

<!-- Hibernate Validator as implementation of the JSR 349 Bean Validation Specification -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.0.Final</version>
</dependency>

以下是可帮助您入门的链接:
https://www.baeldung.com/javax-validation