如何在Java8中使用Optional

时间:2018-02-11 09:45:54

标签: java-8 optional

对Optional的使用有点困惑。 如何使用Optional获得相同的结果?

ModuleEntity module = n.getOutline().getModule()==null?n.getOutline().getParent().getModule():n.getOutline().getModule();
return m.getModule().equals(module)

尝试了很多,但总是NullpointerException...

例如

m.getModule().equals(Optional.ofNullable(n.getOutline().getModule()).orElse(n.getOutline().getParent().getModule())))

以下是完整的代码:

List<RoleModel> roles = app.getRoles().stream()
            .filter(r -> RoleType.MODULE.equals(r.getType()))
            .collect(Collectors.toList()).stream()
            .map(m -> {
                        RoleModel role = Entity2ModelUtils.entity2Model(m);
                        role.setRoles(app.getRoles().stream()
                                    .filter(o -> RoleType.OUTLINE.equals(o.getType()))
                                    .collect(Collectors.toList()).stream()
                                        .filter(n -> m.getModule().equals(Optional.ofNullable(n.getOutline().getModule()).map(zz->n.getOutline().getModule()).orElse(n.getOutline().getParent().getModule())))
                                        .map(z -> Entity2ModelUtils.entity2Model(z))
                                        .collect(Collectors.toList()));
                        return role;})
            .collect(Collectors.toList());

1 个答案:

答案 0 :(得分:3)

正如评论中所述,不要仅使用Optional来替换三元语句。有关详细信息,请参阅问题Uses for Optional

虽然如果你真的想在你的案例中使用Optional,你可以这样做:

Optional
  .ofNullable(n.getOutline().getModule())
  .orElseGet(() -> n.getOutline().getParent().getModule());

这里的关键是对else语句的懒惰评估。我想当你使用Optional.ofNullable(...).orElse(...)时,始终执行的orElse内容会抛出nullpointer异常。