[英]How to propagate property value from list first element to all list elements using java 8 and streams?
我有一个
List<DataDTO>dataPerDemo and each list element has
List<AnotherDataDTO> dataForFirstDemo and it has
List<AnotherWeekDataDTO> weeksForFirstDemo.
每个演示我都有相同的结构。 所需的结果是将属性值从第一个列表元素weekForFirstDemo传播到其余的List元素。 我做到了,但我想知道如何通过使用Java 8和流(可能是flatMap)来优化它。 欢迎所有想法。
问候
private void propagateFlagWeekIsIncludedToTheAllDemos(List<BaselineRatingsSweepsTableDataDTO> sweepsDataPerDemo) {
Iterator<BaselineRatingsSweepsTableDataDTO> sweepsIterator = sweepsDataPerDemo.iterator();
// No primary ... nothing
if (!sweepsIterator.hasNext()) return;
List<BaselineRatingsSweepDataDTO> sweepsForPrimaryDemo = sweepsIterator.next().getSweeps();
// Process remaining demos ( secondary,tersiary .. )
while (sweepsIterator.hasNext()) {
List<BaselineRatingsSweepDataDTO> sweeps = sweepsIterator.next().getSweeps();
processSweeps (sweepsForPrimaryDemo, sweeps);
}
}
private void processSweeps(List<BaselineRatingsSweepDataDTO> sweepsForPrimaryDemo,
List<BaselineRatingsSweepDataDTO> sweepsForAdditionalDemos) {
// TODO: assert equal sizes
// sweepsForPrimaryDemo && sweeps sizes should be the same !
for (int i=0; i < sweepsForAdditionalDemos.size(); i++) {
List<BaselineRatingsSweepWeekDataDTO> primaryWeeks = sweepsForPrimaryDemo.get(i).getWeeks();
List<BaselineRatingsSweepWeekDataDTO> additionalWeeks = sweepsForAdditionalDemos.get(i).getWeeks();
copyIncludeFlag(primaryWeeks, additionalWeeks);
}
}
private void copyIncludeFlag(List<BaselineRatingsSweepWeekDataDTO> primaryWeeks,
List<BaselineRatingsSweepWeekDataDTO> additionalWeeks) {
// TODO: assert equal sizes
for (int i=0; i < primaryWeeks.size(); i++) {
if (primaryWeeks.get(i).getWeek().equals(additionalWeeks.get(i).getWeek())) {
additionalWeeks.get(i).setIsIncluded(primaryWeeks.get(i).getIsIncluded());
}
}
}
您可以在Java 8中使用IntStream进行迭代:对于下面给出的字符串列表,您可以根据实际列表进行修改:
private void copyIncludeFlag(List<String> primaryWeeks, List<String> additionalWeeks) {
IntStream.range(0, primaryWeeks.size()).forEach(weekNumber -> {
if (primaryWeeks.get(weekNumber).equals(additionalWeeks.get(weekNumber))) {
additionalWeeks.get(weekNumber).equals(primaryWeeks.get(weekNumber));
}
});
}
我不知道那是您要找的东西还是其他东西。 但是对于迭代,您可以使用它,它将为您提供帮助。 只需在方法参数中更改列表的类型,就可以了。
请告诉我是否对您有帮助。
我只是建议,它可能是也可能不是确切答案。
我建议使用jOOλ库及其Seq.zip()方法( Seq
是Stream
的子类型),如下所示:
private void propagateFlagWeekIsIncludedToTheAllDemos(List<BaselineRatingsSweepsTableDataDTO> sweepsDataPerDemo) {
if (sweepsDataPerDemo.isEmpty()) {
return; // No primary ... nothing
}
BaselineRatingsSweepsTableDataDTO tableForPrimaryDemo = sweepsDataPerDemo.get(0);
sweepsDataPerDemo.stream()
.skip(1) // skip primary table
.forEach(tableForAdditionalDemo -> processTablePair(tableForPrimaryDemo, tableForAdditionalDemo)); // Process remaining demos ( secondary,tertiary .. )
}
private void processTablePair(BaselineRatingsSweepsTableDataDTO tableForPrimaryDemo,
BaselineRatingsSweepsTableDataDTO tableForAdditionalDemos) {
processSweeps(tableForPrimaryDemo.getSweeps(), tableForAdditionalDemos.getSweeps());
}
private void processSweeps(List<BaselineRatingsSweepDataDTO> sweepsForPrimaryDemo,
List<BaselineRatingsSweepDataDTO> sweepsForAdditionalDemos) {
// TODO: assert equal sizes
Seq.zip(sweepsForPrimaryDemo, sweepsForAdditionalDemos)
.forEach(tuple -> processSweepPair(tuple.v1(), tuple.v2()));
}
private void processSweepPair(BaselineRatingsSweepDataDTO sweepForPrimaryDemo,
BaselineRatingsSweepDataDTO sweepForAdditionalDemo) {
copyIncludeFlag(sweepForPrimaryDemo.getWeeks(), sweepForAdditionalDemo.getWeeks());
}
private void copyIncludeFlag(List<BaselineRatingsSweepWeekDataDTO> primaryWeeks,
List<BaselineRatingsSweepWeekDataDTO> additionalWeeks) {
// TODO: assert equal sizes
Seq.zip(primaryWeeks, additionalWeeks)
.filter(tuple -> tuple.v1().getWeek().equals(tuple.v2().getWeek()))
.forEach(tuple -> tuple.v1().setIsIncluded(tuple.v2().getIsIncluded()));
}
请注意,您仍然需要检查大小是否相等,因为Seq.zip
返回的Seq
的长度是其参数长度的最小值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.