在Java中将一个Optional<List<Object>>转换为另一个Optional<List<Object>>

例如,如何将可选列表对象从一种类型转换为另一种类型

Optional<List<ProductMultipleOptionViewModel>> productOptionType1 // One type

Optional<List<ProductMultipleOption>> productOptionType2 // Other type

ProductMultipleOptionViewModel

类型 1

@Introspected
public record ProductMultipleOptionViewModel(
        ProductOptionViewModel productOption,
        String optionName) {
}

类型 2

 @Introspected
    public record ProductMultipleOption(
            ProductOptionViewModel productOption,
            String optionName) {
    }

我想从 转换Optional<List<ProductMultipleOption>>为其他Optional<List<ProductMultipleOptionViewModel>>. 我试过下面的代码

Optional<List<ProductMultipleOptionViewModel>> conveertItem = Optional.ofNullable(product.getProductMultipleOption())
                .orElseGet(null)
                .stream()
                .map(option -> {
                    return new ProductMultipleOptionViewModel(
                            ProductOptionViewModel.valueOf(//Access the option value//), //access the option value//
                    );
                })
                .collect(Collectors.toList());

使用上面的代码,我无法访问 map 方法中的选项值

如果product.getProductMultipleOption()为 null,则返回 null 或空列表。

回答

您应该很少将OptionalCollections(如ListSet)一起使用。相反,您应该使用空Collections。还要记住,Optionals 不应该真正用于条件逻辑,而应该用作返回值。

要么使用普通if语句:

List<ProductMultipleOptionViewModel> conveertItem = new ArrayList<>(); 
if (product.getProductMultipleOption() != null) {
   for(ProductMultipleOption option : product.getProductMultipleOption()) {
       conveertItem.add(new ProductMultipleOptionViewModel(
          ProductOptionViewModel.valueOf(option)
       ));
   }
}

另一种变体:

List<ProductMultipleOption> list = product.getProductMultipleOption();
if (list == null) {
    list = Collections.emptyList();
}
List<ProductMultipleOptionViewModel> conveertItem = new ArrayList<>(); 
for(ProductMultipleOption option : list) {
   conveertItem.add(new ProductMultipleOptionViewModel(
      ProductOptionViewModel.valueOf(option)
   ));
}

或者,如果你真的想使用Streams 和Optionals (品味问题):

List<ProductMultipleOptionViewModel> conveertItem = Optional.ofNullable(product.getProductMultipleOption())
    .map(List::stream)
    .orElseGet(Stream::empty)
    .map(option -> new ProductMultipleOptionViewModel(
        ProductOptionViewModel.valueOf(option)
    ))
    .collect(Collectors.toList());

现在有很多代码用于简单地转换nullaable List。那么为什么不首先返回一个空List的呢?改成product.getProductMultipleOption()这样:

public List<ProductMultipleOption> getProductMultipleOption() {
    List<ProductMultipleOption> list = ...; // your current logic for getting the list
    return list == null ? Collections.emptyList() : list;
}

这样你就不必担心空检查。因为无论您在何处调用 ,您都只是在处理一个空集合getProductMultipleOption()


以上是在Java中将一个Optional&lt;List&lt;Object&gt;&gt;转换为另一个Optional&lt;List&lt;Object&gt;&gt;的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>