使用Java 8流重构列表创建

5
我找到了以下代码,它会在特定情况下(如果不是OLD)向列表中添加一个项目。然后将该列表打包到公共控件列表中。
    List<ListDataContent> list = new ArrayList<>();

    for (KonditionValue kondition : konditions) {
        if (kondition.getStatusKz().equals(StatusKz.OLD))
            continue;
        for (TermKondValue tilg : kondition.getTermimKonditions()) {
            if (tilg.getStatusKz().equals(StatusKz.OLD))
                continue;

            TerminKondListContent listContent = new TerminKondListContent(tilg, kondition.getChangeDatum(), funds);
            list.add(listContent);
        }
    }

    SimpleListControl listCtrl = new SimpleListControl();
    listCtrl.setDataModel(new ListDataModel(list));

我尝试使用Java8流进行以下重构:
List<ListDataContent> list = konditionen.stream().map(kondition -> map(tilg, kondition.getChangeDate(), funds)).sorted().collect(Collectors.toList());
SimpleListControl listCtrl = new SimpleListControl();
listCtrl.setDataModel(new ListDataModel(list));

问题在于 map 方法...
private TerminKondListContent map(TermKondValue tilg, Date changeDate, BigDecimal funds) {
    if (kondition.getStatusKz().equals(StatusKz.OLD))
        return null;
    for (TermKondValue zins : kondition.getTerminkonditions()) {
        if (zins.getStatusKz().equals(StatusKz.OLD))
            return null;

        return new TerminKondListContent(tilg, changeDate, funds);
    }
    return null;
}

在这些情况下我能做些什么?返回null?然后我可以通过过滤空值从流中获取结果

list.stream().filter( Objects::nonNull )

这里是否可以使用可选项(Optionals)?
1个回答

2
这句话的意思是“它不太好看,但你可以得到以下内容”。
List<ListDataContent> list = 
    konditions.stream()
              .filter(kondition -> !kondition.getStatusKz().equals(StatusKz.OLD))
              .flatMap(kondition -> 
                 kondition.getTerminTilgkonditions()
                          .stream()
                          .filter(tilg -> !tilg.getStatusKz().equals(StatusKz.OLD))
                          .map(tilg -> new AbstractMap.SimpleEntry<>(kondition, tilg))
              )
              .map(e -> new TerminKondTilgListContent(e.getValue(), e.getKey().getChangeDatum(), funds))
              .collect(Collectors.toList());

这将创建一个Stream<KonditionValue>,并仅保留其中状态不为StatusKz.OLD的值。然后,它将它们中的每一个都映射到其TermKondTilgValue,其中也只保留了状态不是StatusKz.OLDTermKondTilgValue
请注意,我们保留对TermKondTilgValueKonditionValue的引用,因为我们之后会需要它们,所以我们使用AbstractMap.SimpleEntry作为两个值的持有者。
最后,这个流被映射到相应的TerminKondTilgListContent并收集成一个列表。

1
这应该可以工作。你不觉得这读起来有点困难吗?我的解决方案看起来更易读一些。虽然我还不确定在这种情况下该如何处理“返回 null”。 - Chris311
2
@Chris311,你的解决方案实际上是你旧代码的混合体。我认为它有点难以阅读,因此保留你的for循环不是一个坏主意。 - Tunaki
好的,我不会在这里使用Java8流重构 :-) - Chris311

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