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));