使用java 8流重构创建列表

时间:2016-03-24 14:42:18

标签: java java-8 refactoring java-stream

我找到了以下代码,它在某些情况下(如果它不是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));

问题是地图方法......

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?然后我可以通过

从流中过滤掉null值
list.stream().filter( Objects::nonNull )

在这里使用Optionals是一种选择吗?

1 个答案:

答案 0 :(得分: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 s,其中只保留状态为TermKondTilgValue的{​​{1}}。

请注意,我们会同时提及StatusKz.OLDTermKondTilgValue,因为我们之后需要这样做,因此我们使用KonditionValue作为两个值的持有者。

最后,此Stream将映射到相应的AbstractMap.SimpleEntry并收集到列表中。