[英]How to propagate property value from list first element to all list elements using java 8 and streams?
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. 所需的结果是将属性值从第一个列表元素weekForFirstDemo传播到其余的List元素。 I did it but I wondered how it could be optimized by using java 8 and stream, probably flatMap. 我做到了,但我想知道如何通过使用Java 8和流(可能是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());
}
}
}
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: 您可以在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));
}
});
}
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. 我只是建议,它可能是也可能不是确切答案。
I'd suggest using the jOOλ library and its Seq.zip() method ( Seq
is a subtype of Stream
) like below: 我建议使用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()));
}
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. 请注意,您仍然需要检查大小是否相等,因为Seq.zip
返回的Seq
的长度是其参数长度的最小值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.