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

如果不存在,如何将可选选项映射到另一个可选选项?[重复]

谷梁裕
2023-03-14

我有以下Java 8代码:

public Optional<User> getUser(String id) {
    Optional<User> userFromCache = cache.getUser(id);
    if (userFromCache.isPresent()) {
        return userFromCache;
    }
    return repository.getUser(id);
}

它工作正常,但我想知道如何将调用链接到不使用if。我试过使用orElseGet,但它不允许返回另一个可选

我想要这样的东西:

Optional<User> userFromCache = cache.getUser(id)
    .orElseGet(() -> repository.getUser(id));

共有3个答案

穆俊名
2023-03-14

你还能用吗?:

return (userFromCache.isPresent()) ? userFromCache : repository.getUser(id);

这显然是一个伪装的如果,但任何其他解决方案也是如此。

易超
2023-03-14

您可以根据其他选项的可空值创建可选选项:

public Optional<User> getUser(String id) {
    return Optional.ofNullable(
        cache.getUser(id).orElseGet(
            () -> repository.getUser(id).orElse(null)
        )
    );
}

但是你目前的解决方案显然更具可读性。

邓令
2023-03-14

自Java9起,有Optional.or。它接受另一个可选的供应商。

return cache.getUser(id).or(() -> repository.getUser(id));
 类似资料:
  • 我有两个表和 names表有以下列表: -男性姓名从nameID 1到nameID 10 -女性姓名从nameID 11到nameID 21 -两者都从nameID 23到nameID 31 性别表有三个属性: -女性 -男性 -两者 我正在使用引导选择选项,我想显示从nameID11到nameid21的名称,如果用户从gender选择选项中选择女性,等等,这是可能的吗?我看到其他帖子,我注意到他

  • 如果存在,我想在myList中的firstOne上做一些映射。如果不是,我想在第二个上做同样的事情。如果它也不存在,则返回零。 有没有一种方法可以在一个流中编写此代码,并减少代码重复和可选的流中的流?

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件

  • Swift 4还引入了Optionals类型,它处理缺少值。 Optionals说“有一个值,它等于x”或“根本没有值”。 一个Optional本身就是一种类型,实际上是Swift 4的新超级动力枚举之一。 它有两个可能的值, None和Some(T) ,其中T是Swift 4中可用的正确数据类型的关联值。 这是一个可选的整数声明 - var perhapsInt: Int? 这是一个可选的St

  • Groovy是一种“可选”类型的语言,在理解语言的基础知识时,这种区别很重要。 与Java(一种“强”类型语言)相比,编译器知道每个变量的所有类型,并且可以在编译时理解和遵守合同。 这意味着可以在编译时确定方法调用。 在Groovy中编写代码时,开发人员可以灵活地提供类型或不提供类型。 这可以提供一些简单的实现,并且在正确使用时,可以以强大且动态的方式为您的应用程序提供服务。 在Groovy中,可

  • Uragano还提供了一些可选项配置,用于服务调优 service.AddUragano(context.Configuration, builder => { builder.AddClient<LoadBalancingPolling>(); builder.