繁体   English   中英

如何使用Java 8和流将属性值从列表的第一个元素传播到所有列表元素?

[英]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()方法( SeqStream的子类型),如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM