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

Convert one Optional<List<Object>> to another Optional<List<Object>> in Java

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

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 return null 或空列表。

将 nulls/empty 可选值与处理列表分开考虑会有所帮助。下面的代码使用 Optional.map() 方法处理空值,如果给定的参数为空,则 return 是一个空的可选(适当的 return 类型);否则,它应用列表上的映射函数。

Optional<List<ProductMultipleOptionViewModel>> convertedItem =
        Optional.ofNullable(product.getProductMultipleOption())
                .map(list -> list.stream()
                        .map(option -> new ProductMultipleOptionViewModel(
                                option.productOption(),
                                option.optionName()))
                        .collect(Collectors.toList()));

您应该很少同时使用 OptionalCollection(如 ListSet)。相反,您应该使用空 Collections。还要记住 .

要么使用正常的 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());

现在有很多用于简单地转换 nullable List 的代码。那么,为什么不首先 return 一个空的 List 呢?将 product.getProductMultipleOption() 更改为如下内容:

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

这样你就永远不必担心空值检查。因为无论您在哪里调用 getProductMultipleOption().

,您都只是在处理一个空集合