这是在 Java 中使用 Optional 的正确方法吗?

Is this the correct way to use Optional in Java?

我有一个看起来像这样的方法

public OutputType convert(InputType input) 
{
     if (input == null) {
         return null;
     }
     
     return OutputType.builder().withSomeProperty(input.getSomeProperty()).build();

}

由于输入参数和 return 类型都可能为空,我想到使用 Java8 可选来重构它们。如果我尝试以下:

public Optional<OutputType> convert(Optional<InputType> inputOptional) 
{
     return inputOptional.map((input) -> new OutputType().setSomeProperty(input.getSomeProperty()));

}

我有 2 个相同的问题:

  1. 这是从一种可选类型到另一种可选类型的最佳转换方式吗?
  2. 我不太确定这种转换的优势。在客户端代码中,而不是 null 检查,客户端仍然需要做 optional.isPresent() ?我不太相信我通过重构获得了什么。

谢谢

快速回答您的问题:

  1. 没有。 Optional 不适用于可选参数。你作为 return 类型的用法是正确的,尽管

  2. Optional 是一个 monad。您不应该命令式地使用它,而是以功能性的方式使用它

请检查以下代码:

public Optional<OutputType> convert(InputType input) {

    return input == null ?
           Optional.empty() :
           Optional.of(OutputType.builder()
                   .withSomeProperty(input.getSomeProperty())
                   .build());
}

至于这个方法应该怎么用,不要拘泥于Optional.isPresent而已。根据您的需要使用 Optional 方法:

InputType someInput = ...;

Optional<OutputType> output = instanceOfYourClass.convert(someInput);

output.ifPresent(o -> System.out.println("This is my output " + o));

// or

output.map(OutputType::getSomeProperty)
      .ifPresent(p -> System.out.println("This is my property " + p));