如何将 List<Optional<Type>> 转换为 List<Type>?

3

我已经将一个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>
3个回答

7

筛选出所有空值并使用 map 获取非空值:

List<TXN_PMTxnHistory_rb> listHistory_rb6 = 
    listHistory_rb5.values()
                   .stream()
                   .filter(Optional::isPresent)
                   .map(Optional::get)
                   .collect(Collectors.toList());

2
使用称为流的Optional上的flatMap方法可以实现此操作,它将删除任何“空”Optional
List<TXN_PMTxnHistory_rb> listHistory_rb6 = 
    listHistory_rb5.values()
                   .stream()
                   .flatMap(Optional::stream)
                   .collect(Collectors.toList());

Flatmap本质上执行两个操作 - "映射"和"扁平化"。在映射阶段中,它调用您传递的任何方法,并期望返回一个新的流 - 在这种情况下,原始List中的每个Optional将成为包含1或0个值的Stream
然后,扁平化阶段将创建一个包含所有映射的Stream结果的新Stream。因此,如果您的List中有2个Optional项,一个为空,另一个为满的,则生成的Stream将从第一个映射的Stream中包含0个元素,从第二个映射的Stream中包含1个值。

请注意,Optional.stream() 需要 Java 9。 - Kayaman
我喜欢的解决方案,而且解释得也很好。值得赞扬。 - Ole V.V.

1

另一个选项是获取所有值,然后过滤出nulls

List<TXN_PMTxnHistory_rb> listHistory_rb6 =
        listHistory_rb5.values().stream()
                       .map(opt -> opt.orElse(null))
                       .filter(Objects::nonNull)
                       .collect(Collectors.toList());

1
@AndrewTobilko 谢谢,我错过了。已更改为 opt -> opt.orElse(null) - oleg.cherednik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接