繁体   English   中英

转换一个可选<list<object> > 到另一个可选<list<object> > 在 Java </list<object></list<object>

[英]Convert one Optional<List<Object>> to another Optional<List<Object>> in Java

例如,如何将可选列表 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 或空列表。

您应该很少同时使用OptionalCollection (如ListSet )。 相反,您应该使用空Collection 另请记住, Optional不应真正用于条件逻辑,而应用作返回值

使用正常的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)
   ));
}

或者,如果您真的想使用StreamOptional (口味问题):

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

现在有很多代码可以简单地转换null能够List 那么为什么不首先返回一个空List呢? product.getProductMultipleOption()更改为如下内容:

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

这样您就不必担心 null 检查。 因为您只是在调用getProductMultipleOption()的任何地方使用一个空集合。

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

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

可能不是做任何你正在做的事情的最佳方式......但是如果你正在尝试使用你所拥有的并保持最小化来回答你的问题:

private List<ProductMultipleOption> getProductOptionViewModelList() {
    /* simulating return of a list that could be null. */
    return null;
}
private Optional<List<ProductMultipleOption>> getProductMultipleOptionNull() {
    /* simulating return of an optional list. */
    return Optional.empty();
}
private static class ProductOptionViewModel { }
public record ProductMultipleOptionViewModel(
        ProductOptionViewModel productOption,
        String optionName) {
}
public record ProductMultipleOption(
        ProductOptionViewModel productOption,
        String optionName) {
}

/*
 Create your own methods to convert the models.

 Replace the variables with whichever method is available to get the name:
        (inputOption.productOption, inputOption.optionName)
        (inputOption.productOption(), inputOption.optionName())
.           (inputOption.getProductOption(), inputOption.getOptionName())
*/

private ProductMultipleOptionViewModel convertToMultipleOptionViewModel(
        ProductMultipleOption inputOption) {
    return new ProductMultipleOptionViewModel(
            inputOption.productOption,
            inputOption.optionName);
}
private ProductMultipleOption convertToMultipleOption(
        ProductMultipleOptionViewModel inputOption) {
    return new ProductMultipleOption(
            inputOption.productOption,
            inputOption.optionName);
}


/*
If the list you're getting is Optional<List<ProductOptionViewModel>>
    and you want List<ProductMultipleOptionViewModel>
*/
List<ProductMultipleOptionViewModel> convertedFromOptionalList =
        getProductMultipleOptionNull()
            .stream()
            .flatMap(Collection::stream)
            .map(this::convertToMultipleOptionViewModel)
            .toList();

/*
If the list you're getting is List<ProductOptionViewModel>
    and you want List<ProductMultipleOptionViewModel>
*/
List<ProductMultipleOptionViewModel> convertedFromNullableList = Optional
        .ofNullable(getProductOptionViewModelList())
            .stream()
            .flatMap(Collection::stream)
            .map(this::convertToMultipleOptionViewModel)
            .toList();

/*
If for some reason you're trying to get the list as
    Optional<List<ProductOptionViewModel>> you can wrap
    them with Optional.of() :
*/
Optional<List<ProductMultipleOptionViewModel>> convertedFromOptionalList = Optional
        .of(Optional.ofNullable(getProductOptionViewModelList())
            .stream()
            .flatMap(Collection::stream)
            .map(this::convertToMultipleOptionViewModel)
            .toList());

Optional<List<ProductMultipleOptionViewModel>> convertedFromNullableList = Optional
        .of(getProductMultipleOptionNull()
            .stream()
            .flatMap(Collection::stream)
            .map(this::convertToMultipleOptionViewModel)
            .toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM