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

时间:2019-09-11 08:18:57

标签: java java-8 optional

我已将值从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 个答案:

答案 0 :(得分:7)

过滤掉所有空值,然后使用map获得非空值:

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

答案 1 :(得分:2)

可以在flatMap s流中使用称为Optional的方法来执行此操作,该方法将删除所有“空” Optional s。

List<TXN_PMTxnHistory_rb> listHistory_rb6 = 
    listHistory_rb5.values()
                   .stream()
                   .flatMap(Optional::stream)
                   .collect(Collectors.toList());

Flatmap本质上执行两件事-“映射”和“扁平化”。在 mapping 阶段,它调用您传入的任何方法,并期望返回新的流-在这种情况下,原始Optional中的每个List都将变成{{1 }}包含1或0个值。

展平阶段将创建一个新的Stream,其中包含所有映射的Stream的结果。因此,如果您的Stream中有2个Optional项目,一个为空,一个为满,则结果List将包含来自第一个映射的Stream的0个元素和1个值从第二个开始。

答案 2 :(得分:1)

另一种选择是获取所有值,然后过滤掉nulls

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