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

获取可选基于条件Java[重复]

弓华茂
2023-03-14

我试图根据优先级和条件从多个可选项中获取值,比如在下面两组可选项中,可以返回的活动是步行和游泳。如果在任意一个选项中有任何活动,如果有游泳,那么游泳应该优先于步行。如果没有活动,则返回空。我设法写了它,但有太多的条件,想看看是否有一个聪明的方式来避免这么多的条件

public Optional<Activity> getActivity(){
    Optional<Activity> activityWhenSunShines= getActivityWhenSunShiningForUser(u);
    Optional<Activity> activityWhenDayIsGood= getActivityWhenDayIsGoodForUser(u);
    if(activityWhenSunShines.isPresent() && Activity.SWIMMING == activityWhenSunShines.get()){
      return activityWhenSunShines;
    }else if(activityWhenDayIsGood.isPresent() && Activity.SWIMMING == activityWhenDayIsGood.get()){
      return activityWhenDayIsGood;
    }else if(activityWhenSunShines.isPresent()){
      return activityWhenSunShines;
    }else if(activityWhenDayIsGood.isPresent()){
      return activityWhenSunShines;
    }else{
      return Optional.empty();
    }
  }

共有2个答案

陈寒
2023-03-14

病人:医生,医生!我把锤子砸在脸上的时候很疼!

医生:好的。那就停止这样做。

可选的(至少在java生态系统中)基本上是不好的。对于流终端返回值来说,这没什么大不了的。

更好的替代方案是只进行数据结构设置,其中nullOptional都不相关。下一个最佳选择是使用null(如果您更喜欢编译时检查,还可以添加一些null注释)。一个非常遥远的糟糕的第三个解决方案是可怕的可选方案。

例如,在这里,为什么不进行活动呢。NOTHING,specgAWSSFU永远不返回null?

如果这样做,您的代码会是什么样子:

Activity activityWhenSunShines = getActivityWhenSunShiningForUser(u);
Activity activityWhenDayIsGood = getActivityWhenDayIsGoodForUser(u);

return
  (activityWhenSunShines == Activity.SWIMMING || activityWhenDayIsGood) ? Activity.SWIMMING :
  activityWhenSunShines != Activity.NOTHING ? activityWhenSunShines :
  activityWhenDayIsGood;

如果您在此处更喜欢null而不是什么,则它是完全相同的代码,只需将active替换为null即可。

Optional不组合(为了组合,泛型有co/contra/in/legacy variance)。Optional引入的空维度不玩这个游戏;例如,你可以编写一个包含数字列表或其中某个子类的方法。你不能编写一个(类型安全的)方法来包含字符串可选的列表

周伟泽
2023-03-14

这个代码

activityWhenSunShines.isPresent() && Activity.SWIMMING == activityWhenSunShines.get()

可以转换为更实用的样式,无需isPresent后跟get

activityWhenSunShines.map(a -> a == Activity.SWIMMING).orElse(false)

最后3个案例可替换为可选。或(在Java 9中添加)。

这给了你:

Optional<Activity> activityWhenSunShines = getActivityWhenSunShiningForUser(u);
Optional<Activity> activityWhenDayIsGood = getActivityWhenDayIsGoodForUser(u);

if(activityWhenSunShines.map(a -> a == Activity.SWIMMING).orElse(false)){
  return activityWhenSunShines;
} else if(activityWhenDayIsGood.map(a -> a == Activity.SWIMMING).orElse(false)){
  return activityWhenDayIsGood;
}
return activityWhenSunShines.or(() -> activityWhenDayIsGood);
 类似资料:
  • 我需要国家列表,其中没有城市或地方,这意味着所有的城市或地方的国家是空的或空的。不要国家,如果国家的一个记录有城市或地方价值。

  • 问题内容: 如何获得翡翠玉根据条件渲染复选框的选中属性?类似于以下两个HTML复选框标记版本: 这似乎是未经检查的唯一有效版本: 选中后: 到目前为止,这是我尝试过的: 这玉很好: 因为它呈现了这一点: 但是这个翡翠不好: 因为它呈现了这一点: 代替这个: 我如何让Jade渲染整个选中的属性,而不只是渲染选中的服装的值? 问题答案: 您可以使用:

  • 本文向大家介绍PHP基于imap获取邮件实例,包括了PHP基于imap获取邮件实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP基于imap获取邮件的方法。分享给大家供大家参考。具体实现方法如下: imap是一款邮件交互访问的协议了,下面是实例主要利用php imap模块来快速获取邮件,列出所有目录,代码如下: 重新打开指定的目录: 补充: 1. windows安装imap 注意在

  • 此问题与几天前发布的问题类似,将行从0折叠到0 与前一个问题不同的是,我们如何根据Id折叠那些时间差小于或等于60的行。 例如,使用相同的数据集 这将通过ID计算时差 这将导致如下所示的新列差异 现在只按< code >事件折叠行。身份证明..其中时间差小于或等于60,即< code>diff 正在寻找有关如何创建这种折叠数据集的帮助。提前谢谢。

  • 问题内容: 我有一个这样的类结构: 我的目标是调用get方法,然后检查它是否存在。如果存在,则返回该属性;如果不存在,则仅返回null。所以像这样: 当然,这不是正确的Java 8可选语法,但这就是我的“伪代码”。用Java 1行有什么办法实现这一点? 问题答案: 您正在描述的是方法: 如果值不存在,则可让您使用函数在内转换该值,如果不存在该值,则返回一个空值(可选)。 还要注意,您可以从映射函数