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

Java 8 这是在Java中使用Optional的正确方法吗?,java-8,null,optional,Java 8,Null,Optional,我有一个类似这样的方法 public OutputType convert(InputType input) { if (input == null) { return null; } return OutputType.builder().withSomeProperty(input.getSomeProperty()).build(); } 由于输入参数和返回类型都可能为空,因此我考虑使用Java8 Optional重构相同的

我有一个类似这样的方法

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

}
由于输入参数和返回类型都可能为空,因此我考虑使用Java8 Optional重构相同的类型。如果我试图:

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

}
公共可选转换(可选输入可选)
{
return inputooptional.map((输入)->new OutputType().setSomeProperty(输入.getSomeProperty());
}
关于同一问题,我有两个问题:

  • 这是从一种可选类型转换到另一种可选类型的最佳方式吗
  • 我不太确定这种转换的好处。在客户端代码中,客户端仍然需要执行
    可选操作,而不是
    null
    检查。isPresent()
    ?我不太相信我通过这次重构得到了什么

  • 感谢您快速回答您的问题:

  • 否。
    可选
    不用于可选参数。但是,您作为返回类型的用法是正确的

  • 可选
    是单子。您不应该强制使用它,而是以功能性的方式使用它

  • 请检查以下代码:

    public Optional<OutputType> convert(InputType input) {
    
        return input == null ?
               Optional.empty() :
               Optional.of(OutputType.builder()
                       .withSomeProperty(input.getSomeProperty())
                       .build());
    }
    

    谢谢你的回复。为什么您建议我们不使用它来模拟输入值的缺失?@Pritpal,因为您强制调用方使用Optional包装参数,并且您还必须检查方法中是否存在值,这与检查null是一样的。您可以使用
    return Optional.ofNullable(input).map避免null检查(o->OutputType.builder().withSomeProperty(o.getSomeProperty()).build());
    @fps在我的书中,在本例中,由于您是为了返回它而这样做的,所以没关系。我做了与您几乎相同的事情,但没有显式的空检查。通常,为可选参数建模的最佳方法是重载该方法,即
    OutputType convert(InputType input)
    OutputType convert()
    。但在这种特定情况下,参数不是可选的。当参数不存在时,该方法没有任何有意义的结果,
    null
    或空的
    optional
    都不起任何作用(除了将问题的检测推迟到以后,可能是在无法跟踪问题的根源时)。当没有
    InputType
    实例时,不应调用该方法。调用方可能可以使用
    optional.map(Type::convert)
    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));