簡體   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