将此空检查转换为Java 8可选

时间:2018-10-21 06:13:51

标签: java java-8 optional

我无法理解如何使用Java 8 Optional

删除以下空检查
for (A objA : listOfObjectsA) {
    if (objA.getStringField() == null) continue;
        // some code to do if not null
}

4 个答案:

答案 0 :(得分:2)

您不必为此使用Optional。您可以使用null过滤Stream元素:

listOfObjectsA.stream()
              .filter(objA -> objA.getStringField() != null)
              .forEach (... do something  ...);

要使用Optional,您可以编写Optional.ofNullable(objA.getStringField()).isPresent(),但这似乎毫无意义。

答案 1 :(得分:2)

您可以将 Java8 样式的代码替换为流和Optional。但是我个人认为,在这种具体情况下,这并不比POJO更好(后者更加简单易读):

Optional.ofNullable(listOfObjectsA).orElse(Collections.emptyList()).stream()
        .filter(Objects::nonNull)
        .filter(objA -> Objects.nonNull(objA.getStringField()))
        .forEach(objA -> {
            // some code to do if not null
        });

如果您确定,给定列表不能为null,每个元素objA也不能为null,那么在这种情况下,您绝对可以避免一些无用的检查:< / p>

listOfObjectsA.stream()
        .filter(objA -> Objects.nonNull(objA.getStringField()))
        .forEach(objA -> {
            // some code to do if not null
        });

答案 2 :(得分:2)

如果“某些不为null的代码只能在objA.getStringField()上运行,则可以执行以下操作:

listOfObjectsA.stream()
              .map(A::getStringField)
              .filter(Objects::nonNull)
              .forEach(e -> ...);

但是,如果您仍然希望访问A元素,那么正如其他答案所示,您别无选择,只能执行明确的objA.getStringField() != null

listOfObjectsA.stream()
              .filter(a -> a.getStringField() != null)
              .forEach(a -> ...);

答案 3 :(得分:0)

理想情况下,无需选择,您可以

listOfObjectsA.stream().filter(objA -> objA.getStringField() != null)
                       .forEach(objA -> { /* some code to do if not null*/ });
相关问题