如何将 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 个值从第二个开始。