当前位置: 首页 > 知识库问答 >
问题:

Java 8可选的多级空检查

公良同
2023-03-14

我正在开发一个使用返回可选的方法的程序,我需要迭代它并创建一个新对象。我该怎么做?

import java.util.Optional;

class Info {
    String name;
    String profileId;

    Info(String name, String profileId) {
        this.name = name;
        this.profileId = profileId;
    }
}

class Profile {
    String profileId;
    String profileName;

    Profile(String profileId, String profileName) {
        this.profileId = profileId;
        this.profileName = profileName;
    }
}

class Content {
    String infoName;
    String profileName;

    Content(String infoName, String profileName) {
        this.infoName = infoName;
        this.profileName = profileName;
    }

    public java.lang.String toString() {
        return "Content{" + "infoName='" + infoName + '\'' + ", profileName='" + profileName + '\'' + '}';
    }
}

class InfoService {
    Optional<Info> findByName(String name){ //todo implementation }
}

class ProfileService {
   Optional<Profile> findById(String id) { //todo implementation }
}

class ContentService {

    Content createContent(Info i, Profile p) {
        return new Content(i.name, p.profileName);
    }

    Content createContent(Info i) {
        return new Content(i.name, null);
    }
}

public static void main(String[] args) {

    InfoService infoService = new InfoService();
    ProfileService profileService = new ProfileService();
    ContentService contentService = new ContentService();

    //setup
    Info i = new Info("info1", "p1");
    Profile p = new Profile("p1", "profile1");

    // TODO: the following part needs to be corrected
    Optional<Info> info = infoService.findByName("info1");

    if (!info.isPresent()) {
        return Optional.empty();
    } else {
         Optional<Profile> profile = profileService.findById(info.get().profileId);

         Content content;

         if (!profile.isPresent()) {
             content = contentService.createContent(info);
         } else {
             content = contentService.createContent(info, profile);
         }

        System.out.println(content);
     }
}

我对Java可选选项的理解是减少if null检查,但如果没有if检查,我仍然无法做到这一点。使用mapflatMap并拥有简洁的代码,有没有更好的解决方案?

共有1个答案

汝弘深
2023-03-14

这是你能得到的最好的结果<代码>映射仅在lambda存在时执行orElseGet仅在lambda未执行时执行。

return infoService.findByName("info1")
    .map(info ->
        profileService.findById(info.profileId)
            .map(profile -> contentService.createContent(info, profile))
            .orElseGet(() -> contentService.createContent(info))
    );
 类似资料:
  • 我有下面的代码,这是有点难看的多个空检查。 所以我尝试使用,如下所示,但是如果有人阅读我的代码,仍然很难理解。 在Java9中,我们可以使用和,但是在Java8中还有其他方法吗?

  • 下面是我的代码,按预期工作。但我需要用Optional.ofNullable替换它 如何使用

  • 有人能解释一下<code>是可选的</code>如何帮助我们避免<code>NullPointerException</code>吗? 这段代码不是也容易出现<code>NullPointerException</code>吗?如果是这样的话,那么为什么这个代码比其他代码更受欢迎 除了帮助我们了解函数是否实际具有返回值之外,还提供了什么可能的好处

  • 有人能解释一下如何帮助我们避免? 这段代码不是也容易出现吗?如果是这样的话,那么为什么这个代码比 除了帮助我们了解函数是否实际具有返回值之外,还有什么可能的好处

  • 我喜欢的,我觉得很酷的东西 有人能告诉我我没意见吗?也许很酷,但成本很高?我不知道.多谢.