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

Java 8可选,而不是if

聂和宜
2023-03-14

我有可选的问题,我不知道如何处理它。

public void check(String name) {
   if (name != null)
      doSomething(name);
   else 
      doMore();
} 

如何将此if更改为可选?

共有3个答案

葛书
2023-03-14

没有理由改变您的实现。在java 8中,如果没有如果,就没有办法用可选选项来做你想做的事情,同时尊重不使用“地图”作为副作用的想法。

我是说,你本来可以

public void check(String name) {
    Optional<String> nameOpt = Optional.ofNullable(name);
    nameOpt.ifPresent(n -> doSomething(n));
    if (!nameOpt.isPresent()) {
        doMore();
    }
}

但这毫无意义。这里有一篇很好的文章,介绍了Optional试图解决的问题(以及它的用途):主要针对返回类型。其他东西只是过度使用而已。

欧镜
2023-03-14

当然,有一种方法可以使用Optionals(例如,参见尤金的答案)创建相同的代码,但你不应该在这里使用Optionals(imho)。

要么将Optional传递到方法中,这会给调用者带来开销,而且查看引入的用例Optional的原因/原因并没有真正意义
或者您可以自己在方法中创建可选的。这更“好”,但非常麻烦,掩盖了实际发生的事情,如果我在代码审查中遇到它,我会要求对其进行更改。只需使用可选将代码片段与当前代码进行比较即可——您的代码可能在字符方面较短,这是显而易见的。在这里使用Optionals的唯一好处是,它似乎变成了一行,首先,没有什么比可读性更重要,而且,如果你添加一些大括号,没有它你也可以实现。

一句话:你的代码完全没问题。

景嘉实
2023-03-14

有一个非常简洁的方法,但在jdk-9中。。。

public void check(String name){
     Optional.ofNullable(name)
            .ifPresentOrElse(YourClass::doSomething, YourClass::doMore);
} 

假设doSomethingdoMore是静态方法。。。如果没有,应该使用实例,比如this::doSomethingthis::doMore

 类似资料:
  • 我试图导入的应用程序中的gradle版本与JDK11不兼容,而JDK11正是android studio用作其嵌入式JDK的。我的机器上有JDK8。我已经尝试进入项目结构来更改JDK8位置的路径,但是如果我尝试更改它,就会出现错误。它说我必须选择一个有效的JDK11目录。如何让android studio使用JDK 8?错误截图

  • 在Java8中,可以返回而不是。Java8文档说,可选的是“一个容器对象,它可以包含非空值,也可以不包含非空值。如果存在一个值,isPresent()将返回true,而get()将返回该值。” 在实践中,这为什么有用呢?另外,有没有使用作为首选项的情况?那表演呢?

  • 如果我的API提供了一个流,客户端是否有办法修改基础集合? 例如: 客户端是否可以调用并以某种方式修改的内容?

  • 编译错误->[无法推断flatMap(函数>)的类型参数]

  • 我正在解析输入JSON。对于一个字段,有3种可能: 字段不存在; 该值设置为NULL; 该值设置为有效值。 null

  • 我知道Optionals ifPresent()调用的目的是替换空检查。从Oracle文档中提取代码示例,它在简单情况下似乎非常有用。例如: 我只是想了解为什么这被认为比空检查更好。可读性?表演在我看来,这会对项目性能造成影响,因为必须引入一个新的对象才能容纳我们最终希望获得的对象?总之,为什么这是 如果(声卡!=null),则认为比这更好。