Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java8和streams将属性值从列表第一个元素传播到所有列表元素?_Java_Java 8_Java Stream - Fatal编程技术网

如何使用Java8和streams将属性值从列表第一个元素传播到所有列表元素?

如何使用Java8和streams将属性值从列表第一个元素传播到所有列表元素?,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个 List<DataDTO>dataPerDemo and each list element has List<AnotherDataDTO> dataForFirstDemo and it has List<AnotherWeekDataDTO> weeksForFirstDemo. ListdataPerDemo和每个列表元素 列出FirstDemo的数据,它已经 列出FirstDemo的周数。 我对每个演示都有相同的结构。期望的结果是将

我有一个

List<DataDTO>dataPerDemo and each list element has

List<AnotherDataDTO> dataForFirstDemo and it has

List<AnotherWeekDataDTO> weeksForFirstDemo.
ListdataPerDemo和每个列表元素
列出FirstDemo的数据,它已经
列出FirstDemo的周数。
我对每个演示都有相同的结构。期望的结果是将属性值从第一个列表元素weeksForFirstDemo传播到其余的列表元素。我做到了,但我想知道如何使用Java8和stream(可能是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());
        }
    }
} 
private void propagatedFlagWeekis包含到所有演示(列表扫描数据记录){
迭代器sweepsIterator=sweepsdapterdemo.Iterator();
//没有主…什么都没有
如果(!sweepsIterator.hasNext())返回;
List sweepsForPrimaryDemo=sweepsIterator.next().getSweeps();
    
//处理剩余演示(辅助、三级..)
while(sweepsIterator.hasNext()){
List sweeps=sweepsIterator.next().getSweeps();
处理扫描(扫描预处理演示,扫描);
    }
}
私有void进程扫描(列表扫描ForPrimaryDemo,
列表扫描(RaditionalDemos){
    
//TODO:断言大小相等
//sweepsForPrimaryDemo&&sweeps大小应相同!
对于(int i=0;i
您可以在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));
                }
        });
            }
private void copyIncludeFlag(列出primaryWeeks,列出additionalWeeks){
IntStream.range(0,primaryWeeks.size()).forEach(周数->{
if(primaryWeeks.get(weekNumber).equals(additionalWeeks.get(weekNumber))){
additionalWeeks.get(weekNumber).equals(primaryWeeks.get(weekNumber));
}
});
}
我不知道这是你要找的还是别的什么。 但对于迭代,您可以使用它,它将帮助您。 只要在方法参数中更改列表的类型,就可以开始了

如果它对您有帮助,请务必告诉我。
我只是建议,它可能是也可能不是确切的答案。

我建议使用库及其方法(
Seq
流的一个子类型),如下所示:

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()));
}
private void propagatedFlagWeekis包含到所有演示(列表扫描数据记录){
if(sweepsDataPerDemo.isEmpty()){
return;//无主…无
}
BaselineRatingsSweepStabledataToTableforPrimarydemo=sweepsDataPerDemo.get(0);
sweepsDataPerDemo.stream()
.skip(1)//跳过主表
.forEach(tableForAdditionalDemo->processTablePair(tableForPrimaryDemo,tableForAdditionalDemo));//处理剩余的演示(二级、三级..)
}
private void processTablePair(基线比率为SweepStabledDatato tableForPrimaryDemo,
基线额定值稳定数据表(用于其他演示){
processSweeps(tableForPrimaryDemo.getSweeps(),tableForAdditionalDemos.getSweeps());
}
私有void进程扫描(列表扫描ForPrimaryDemo,
列表扫描(RaditionalDemos){
//TODO:断言大小相等
序列zip(sweepsForPrimaryDemo、sweepsForAdditionalDemos)
.forEach(tuple->processSweepPair(tuple.v1(),tuple.v2());
}
private void processSweepPair(基线比率SweepDatadTo sweepForPrimaryDemo,
基线比率扫描数据(用于额外的扫描演示){
copyIncludeFlag(sweepForPrimaryDemo.getWeeks(),sweepForAdditionalDemo.getWeeks());
}
私有无效副本(列出主要周,
列出附加周数){
//TODO:断言大小相等
序号zip(原始周、附加周)
.filter(tuple->tuple.v1().getWeek().equals(tuple.v2().getWeek()))
.forEach(tuple->tuple.v1().setIsIncluded(tuple.v2().getIsIncluded());
}

请注意,您仍然需要检查大小是否相等,因为
Seq.zip
返回一个
Seq
,其长度是其参数长度中的最小值。

通常,如果您知道要通过第一个元素传播,您应该只使用索引值
get(0)
函数。你也尝试过java8的循环吗?你能详细说明你想要的结果吗?你也可以发布你的代码。添加了迭代器的代码,但我在想如何更好地优化它是的,它正在工作,但我认为有更优化的方法:)是的。可能是。当你发现时一定要告诉我们。我们一直在学习:)@dangi13+1因为努力的想法不是只优化最后一种方法,而是优化整个传播过程,对吧!我没有足够仔细地阅读这个问题,只看了被接受的答案(顺便说一句,因为它被接受了,所以我认为它解决了问题;))我会马上编辑我的答案。