简体   繁体   English

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

[英]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()方法( 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()));
}

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.

相关问题 如何使用 Java 流制作列表元素的所有变体? - How to make all variations of list elements using Java streams? 如何只替换列表的第一个元素<Character>使用 java 流而不对列表的其余部分进行任何更改? - How to replace only the first element of a List<Character> using java streams without making any changes to the rest of the list? Java - 使用流获取具有特定属性的列表元素 - Java - using streams to get list elements with a certain property 使用Java8流过滤列表并获取第一个元素 - Using Java8 streams to filter list and get the first element 如何使用Java Streams在修改后的列表中包含未修改列表中的元素? - How to include elements from unmodified list in modified list with Java Streams? 如果列表不为空,如何使用 Java 8 lambda/streams 使用我的服务从列表中删除每个元素 - How to remove every element from a list if the list is not empty using Java 8 lambda/streams using my service Java 8 Streams-如何将列表中具有相同字段的元素合并到一个元素并进行汇总 - Java 8 Streams - how to merge elements from the list with the same fields to one element and sum up Java Map 与列表值使用流列出? - Java Map with List value to list using streams? Java Streams,跳过元素列表流中每个列表中的第一项 - Java Streams, skipping the first item in each list in a Stream of List of elements 使用Java 8 Streams从DTO的数组列表中删除元素 - Removing element from an array list within a DTO using java 8 Streams
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM