在 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()));
您应该很少同时使用 Optional
和 Collection
(如 List
或 Set
)。相反,您应该使用空 Collection
s。还要记住 .
要么使用正常的 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)
));
}
或者如果你真的想使用 Stream
s 和 Optional
s(品味问题):
List<ProductMultipleOptionViewModel> conveertItem = Optional.ofNullable(product.getProductMultipleOption())
.map(List::stream)
.orElseGet(Stream::empty)
.map(option -> new ProductMultipleOptionViewModel(
ProductOptionViewModel.valueOf(option)
))
.collect(Collectors.toList());
现在有很多用于简单地转换 null
able 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()
.
,您都只是在处理一个空集合
如何将可选列表对象从一种类型转换为另一种类型,例如
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()));
您应该很少同时使用 Optional
和 Collection
(如 List
或 Set
)。相反,您应该使用空 Collection
s。还要记住
要么使用正常的 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)
));
}
或者如果你真的想使用 Stream
s 和 Optional
s(品味问题):
List<ProductMultipleOptionViewModel> conveertItem = Optional.ofNullable(product.getProductMultipleOption())
.map(List::stream)
.orElseGet(Stream::empty)
.map(option -> new ProductMultipleOptionViewModel(
ProductOptionViewModel.valueOf(option)
))
.collect(Collectors.toList());
现在有很多用于简单地转换 null
able 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()
.