这是在 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 个相同的问题:
- 这是从一种可选类型到另一种可选类型的最佳转换方式吗?
- 我不太确定这种转换的优势。在客户端代码中,而不是
null
检查,客户端仍然需要做 optional.isPresent()
?我不太相信我通过重构获得了什么。
谢谢
快速回答您的问题:
没有。 Optional
不适用于可选参数。你作为 return 类型的用法是正确的,尽管
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));
我有一个看起来像这样的方法
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 个相同的问题:
- 这是从一种可选类型到另一种可选类型的最佳转换方式吗?
- 我不太确定这种转换的优势。在客户端代码中,而不是
null
检查,客户端仍然需要做optional.isPresent()
?我不太相信我通过重构获得了什么。
谢谢
快速回答您的问题:
没有。
Optional
不适用于可选参数。你作为 return 类型的用法是正确的,尽管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));