如何使用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因为努力的想法不是只优化最后一种方法,而是优化整个传播过程,对吧!我没有足够仔细地阅读这个问题,只看了被接受的答案(顺便说一句,因为它被接受了,所以我认为它解决了问题;))我会马上编辑我的答案。