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

时间:2016-11-14 11:25:12

标签: java if-statement functional-programming java-8 optional

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

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

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

5 个答案:

答案 0 :(得分:18)

可选的设计灵感来自功能编程世界的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*)
}

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

如果要对基础值执行操作,请使用map方法,为其提供Function,该Optional应应用于由ifPresent()包装的元素。

最后,您只需使用orElseThrow执行某项操作,抛出异常orElse或只返回orElseGetorElseGet的默认值。请注意,Supplier接受TimeStamp BlockSeqNum SeqNum X-axis Y-axis Z-axis 4294967295 0 0 27 20 -4 4294967295 0 1 48 11 -13 4294967295 0 2 45 0 -7 4294967295 0 3 38 -9 -2 4294967295 0 4 34 -42 -28 4294967295 0 5 -29 35 -35 4294967295 0 6 -3 -46 0 4294967295 0 7 0 2 -10 4294967295 0 8 6 113 -32 4294967295 0 9 -4 20 27 4294967295 0 10 -14 -15 -19 4294967295 0 11 23 51 -19 4294967295 0 12 10 34 1 4294967295 0 13 -7 -2 15 4294967295 0 14 13 -5 -30 4294967295 0 15 -24 30 51 4294967295 0 16 -18 39 -45 实例,这会使其懒惰地评估默认值。

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

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

答案 1 :(得分:7)

您不应将Optional用于此类案例

Stuart Marks中的Optional - The Mother of All Bikesheds状态:

  

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

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

  

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

     

避免在方法参数中使用Optional

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

         

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

         

    myMethod(Optional.empty());

  •   

另见Why should Java 8's Optional not be used in arguments

答案 2 :(得分:3)

使用Optional<Integer>

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

Optional<>只是Optional模式的一个实现。有用的方法也是Optional<T>#orElse(T default),如果有null,则将值设置为默认值,

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

答案 3 :(得分:-1)

您需要清楚自己对方法的期望。可能性:

  • 您希望它像以前一样继续工作,并处理客户端提供空值
  • 的情况
  • 您想要将方法更改为接受Optional<Integer>作为参数。 “无空”方式是这样做的,并且根本不适应提供null的调用者 - 如果他们得到NullPointerException,那是他们自己的错,因为他们违反了规则。

您不必使用stream或lambdas来使用Optional(当然,你可以)。

你可以写一下:

public List<T> getAll(Optional<Integer> maybeParameter) {
    if(maybeParameter.isPresent() && maybeParameter.get() > -1) {
        // do something here
    }
}

查看Optional在JavaDoc中的其他方法,看看它是如何使用的。

如果您不想更改方法的签名,可以使用Optional.ofNullable()Integer转换为Optional<Integer>

public List<T> getAll(Integer parameter) {
    Optional<Integer> maybeParameter = Optional.ofNullable(parameter);
    // work with the Optional here as before...
}

但是我在这里质疑这样做的价值。如果您的API接受空值,那么使用Optional“幕后”处理它并不具有优势。

我认为Optional的最佳用途是将其作为API的一部分公开。如果参数是可选的,则将其声明为Optional而不是处理null(或者更好,使用方法重载,因此它们根本不需要传递任何内容)。如果可能未设置返回值,则返回类型Optional,而不是返回null。

答案 4 :(得分:-2)

import java.util.Optional;

public class ExampleNullCheck{

    public static void main(String args[])
    {
        Integer a = null;
        Optional<Integer> checkInt = Optional.ofNullable(a);
        System.out.println(checkInt.isPresent());
    }//main

}//class