Reputation:
I have a
List<DataDTO>dataPerDemo and each list element has
List<AnotherDataDTO> dataForFirstDemo and it has
List<AnotherWeekDataDTO> weeksForFirstDemo.
i have the same structure for each demo. Desired result is the propagate a property value from first list element the weeksForFirstDemo to the rest of List elements. I did it but I wondered how it could be optimized by using java 8 and stream, probably flatMap. All ideas are welcome.
Regards
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());
}
}
}
Upvotes: 1
Views: 310
Reputation: 4496
I'd suggest using the jOOλ library and its Seq.zip() method (Seq
is a subtype of Stream
) like below:
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()));
}
Note that you still need to check if sizes are equal because Seq.zip
returns a Seq
whose length is the minimum of its arguments' lengths.
Upvotes: 0
Reputation: 1275
You can use IntStream for iteration in java 8 : For String list I have given an example below, you can modify according to your actual list:
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));
}
});
}
I do not know if that is what you are looking for or something else. But for iteration you can use this and it will help you. Just change the type of list in method parameters and you are good to go.
Please do let me know if it helped you.
I am only suggesting and it may or may not be the exact answer.
Upvotes: 2