重构具有 java 8 个流的列表的创建
Refactor creation of a list with java 8 streams
我找到了以下代码,它在特定情况下(如果不是旧的)将项目添加到列表中。此列表随后被打包到一个公共控件列表中。
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;
}
在继续的情况下我能做什么? return 无效?然后我可以通过
从流中过滤空值
list.stream().filter( Objects::nonNull )
Optionals 的使用在这里是一个选项吗?
不是很漂亮,但你可以有以下
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.OLD
的 TermKondTilgValue
。
请注意,我们保留对 TermKondTilgValue
和 KonditionValue
的引用,因为我们以后需要,所以我们使用 AbstractMap.SimpleEntry
作为两个值的持有者。
最后将这个Stream映射到对应的TerminKondTilgListContent
并收集到列表中
我找到了以下代码,它在特定情况下(如果不是旧的)将项目添加到列表中。此列表随后被打包到一个公共控件列表中。
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;
}
在继续的情况下我能做什么? return 无效?然后我可以通过
从流中过滤空值list.stream().filter( Objects::nonNull )
Optionals 的使用在这里是一个选项吗?
不是很漂亮,但你可以有以下
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.OLD
的 TermKondTilgValue
。
请注意,我们保留对 TermKondTilgValue
和 KonditionValue
的引用,因为我们以后需要,所以我们使用 AbstractMap.SimpleEntry
作为两个值的持有者。
最后将这个Stream映射到对应的TerminKondTilgListContent
并收集到列表中