user5914617
user5914617

Reputation:

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. 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

Answers (2)

Tomasz Linkowski
Tomasz Linkowski

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

dangi13
dangi13

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

Related Questions