如何在java中使用Optional来检查是否为null以及是否具有特定值?

Ras*_*ari 7 java functional-programming if-statement optional java-8

假设我的项目中有这个代码:

public List<T> getAll(Integer parameter) {
    if(parameter != null && parameter > -1) {
        // do something here
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何进行检查Optional而不是使用if,或者是否还有其他可以使用的东西?

Grz*_*rek 18

Optional的设计灵感来自功能编程世界的monad.在这种情况下,它可能看起来像这样:

public List<T> getAll(Integer parameter) {

    return Optional.ofNullable(parameter)
      .filter(p -> p > -1)
      .map(p -> *some modification*) //this line is optional
      .orElseGet(() -> *some default value, probably an empty list*)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在该filter方法中执行条件检查.如果给定Predicate的匹配不匹配,则底层Optional将为空.

如果要对基础值执行操作,请使用map方法为其提供Function应该应用于包含的元素Optional.

最后,你可以使用简单的执行一些动作ifPresent(),抛出一个异常orElseThrow,或者只是返回默认值orElse或者orElseGet.请记住,orElseGet接受一个Supplier让它懒惰地评估默认值的实例.

如果你想深入挖掘,请查看Devoxx的@ stuart-marks对话:https://www.youtube.com/watch?v = Ej0sss6cq14 & t = 2767s

在您的情况下,可能根本不需要可选.只是两种方法.一个有参数而另一个没有.

  • 我很抱歉被接受了答案.提升你的答案,并祝你在这里获得民粹主义徽章. (4认同)
  • @zeroflagL好吧,创建一个仅受益于API的可选实例是值得怀疑的,但要记住它是封装的,而不是暴露给世界.您不强制用户将所有内容都包装到Optional中. (3认同)

Did*_*r L 8

你不应该使用Optional这种情况

正如斯图尔特马克斯在" 可选 - 所有Bikesheds的母亲"中所说:

规则#4:创建一个Optional通常是一个坏主意,因为它的特定目的是从中链接方法以获取值.

这会产生无用的开销,而不会对代码可读性和可维护性进行任何改进.因此,您不应将参数包装为可选参数.

规则#6:避免在字段,方法参数和集合中使用Optional.

避免在方法参数中使用Optional

  • 它不能真正使参数可选
  • 强制调用网站为所有内容创建Optionals:

    myMethod(Optional.of("some value"));

    myMethod(Optional.empty());

另请参见为什么Java 8的Optional不能在参数中使用.


xen*_*ros 3

使用Optional<Integer>

public List<T> getAll(Integer paramter) {
    return Optional.ofNullable(parameter)
      .filter(p -> p > -1);
}
Run Code Online (Sandbox Code Playgroud)

Optional<>只是可选模式的一个实现。有用的方法是Optional<T>#orElse(T default)将值设置为默认值,以防出现null,

如果您已经感兴趣但仍然无法解答您的疑问,请在评论中要求澄清。我会尽快回复。

  • 您不应使用“Optional”作为方法的参数。我发现这个很好的答案解释了原因:http://stackoverflow.com/a/39005452/4137489 (8认同)
  • 这个答案实在是太糟糕了。作为参数的可选是一种代码味道,建议使用可选的方式与它应该如何使用无关。 (5认同)