如何将 List<Optional<Type>> 转换为 List<Type>
How to convert List<Optional<Type>> into List<Type>
我已将 Map
中的值提取到 List
,但得到了 List<Optional<TXN_PMTxnHistory_rb>>
,我想将其转换为 List<TXN_PMTxnHistory_rb>
。
我的代码:
List<Optional<TXN_PMTxnHistory_rb>> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.collect(Collectors.toList());
我想获得一个List<TXN_PMTxnHistory_rb>
。
过滤掉所有空值,用map
得到非空值:
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
另一种选择是获取所有值,然后过滤掉 nulls
:
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values().stream()
.map(opt -> opt.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
可以在 Optional
的流上使用名为 flatMap
的方法来执行此操作,该方法将删除任何 'empty' Optional
。
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
Flatmap 本质上执行两件事 - "mapping" 和 "flattening"。在 mapping 阶段,它会调用您传入的任何方法并期望返回一个新流 - 在这种情况下,原始 List
中的每个 Optional
都将成为Stream
包含 1 或 0 个值。
flatten 阶段将创建一个新的 Stream
,其中包含所有映射的 Stream
的结果。因此,如果您的 List
中有 2 个 Optional
项,一个为空,一个为满,则生成的 Stream
将包含来自第一个映射 Stream
的 0 个元素和 1 个值从第二个开始。
我已将 Map
中的值提取到 List
,但得到了 List<Optional<TXN_PMTxnHistory_rb>>
,我想将其转换为 List<TXN_PMTxnHistory_rb>
。
我的代码:
List<Optional<TXN_PMTxnHistory_rb>> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.collect(Collectors.toList());
我想获得一个List<TXN_PMTxnHistory_rb>
。
过滤掉所有空值,用map
得到非空值:
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
另一种选择是获取所有值,然后过滤掉 nulls
:
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values().stream()
.map(opt -> opt.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
可以在 Optional
的流上使用名为 flatMap
的方法来执行此操作,该方法将删除任何 'empty' Optional
。
List<TXN_PMTxnHistory_rb> listHistory_rb6 =
listHistory_rb5.values()
.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
Flatmap 本质上执行两件事 - "mapping" 和 "flattening"。在 mapping 阶段,它会调用您传入的任何方法并期望返回一个新流 - 在这种情况下,原始 List
中的每个 Optional
都将成为Stream
包含 1 或 0 个值。
flatten 阶段将创建一个新的 Stream
,其中包含所有映射的 Stream
的结果。因此,如果您的 List
中有 2 个 Optional
项,一个为空,一个为满,则生成的 Stream
将包含来自第一个映射 Stream
的 0 个元素和 1 个值从第二个开始。