Java 8循环特殊金字塔逻辑

Java 8循环特殊金字塔逻辑,java,loops,foreach,java-8,java-stream,Java,Loops,Foreach,Java 8,Java Stream,我有一个List List=Arrays.asList(64048052050170320140,60) 我需要根据下面的迭代逻辑找到给定元素的和。 例如,第一次外部迭代,如640+480,然后640+480+520,依此类推,直到60 下一次迭代从480+520开始,然后是480+520+170,依此类推 示例Java7程序如下 List<Integer> list=Arrays.asList(640,480,520,170,320,140,60); List<

我有一个
List List=Arrays.asList(64048052050170320140,60)
我需要根据下面的迭代逻辑找到给定元素的和。
例如,第一次外部迭代,如640+480,然后640+480+520,依此类推,直到60

下一次迭代从480+520开始,然后是480+520+170,依此类推

示例Java7程序如下

List<Integer> list=Arrays.asList(640,480,520,170,320,140,60);
        List<Integer> newListWithSum=new ArrayList<>();
        for(int mainIndex=0;mainIndex<list.size();mainIndex++) {
            for(int index=mainIndex;index<list.size();index++) {
                int sum=0;
                for(int nestedIndex=mainIndex;nestedIndex<index+1;nestedIndex++) {
                    sum=sum+list.get(nestedIndex);
                }
                newListWithSum.add(sum);
            }
        }
List List=Arrays.asList(640480520170320140,60);
List newListWithSum=newarraylist();

对于(int maindex=0;maindex我觉得这与算法更相似,让我们一步一步来

1) 首先通过在每次迭代中排除第一个整数来获取所有子列表

List<Integer> list=Arrays.asList(640,480,520,170,320,140,60);

    List<List<Integer>> re = IntStream.range(0, list.size())
                                      .mapToObj(sb->list.subList(sb, list.size()))
                                      .filter(s->s.size()>1)
                                      .collect(Collectors.toList());

    re.forEach(ls->System.out.println(ls));
2) 现在在每个列表上做总和

List<List<Integer>> re1 = re.stream()
                            .map(j->IntStream.rangeClosed(2, j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList()))
                            .collect(Collectors.toList());

 re1.forEach(ls->System.out.println(ls));
步骤1和步骤2的组合解决方案

List<List<Integer>> re = IntStream.range(0, list.size())
                                      .mapToObj(sb->list.subList(sb, list.size()))
                                      .filter(s->s.size()>1)
                                      .map(j->IntStream.rangeClosed(2, j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList()))
                                      .collect(Collectors.toList());
List re=IntStream.range(0,List.size())
.mapToObj(sb->list.subList(sb,list.size()))
.filter(s->s.size()>1)
.map(j->IntStream.rangeClosed(2,j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue.sum()).collect(Collectors.toList())
.collect(Collectors.toList());

如果您只想转换现有代码,可以使用以下代码段:

List<Integer> result = IntStream.range(0, list.size())
        .mapToObj(i -> list.subList(i,  list.size()))
        .flatMap(l -> IntStream.rangeClosed(1, l.size()).mapToObj(i -> l.subList(0, i).stream().reduce(0, Integer::sum)))
        .collect(Collectors.toList());

是的,上面列出了Java7逻辑。我需要将它迁移到Java 8。你需要将它“迁移”到Java-8吗?我的意思是为了更好的版本,我需要将它更改为Java 8(如果Stream/IntStream)是这里更好的选择吗?不,你已经有了相当好的选择。在这种情况下,java-8不会提高速度/可读性,也不会提高其他任何东西
List<List<Integer>> re = IntStream.range(0, list.size())
                                      .mapToObj(sb->list.subList(sb, list.size()))
                                      .filter(s->s.size()>1)
                                      .map(j->IntStream.rangeClosed(2, j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList()))
                                      .collect(Collectors.toList());
List<Integer> result = IntStream.range(0, list.size())
        .mapToObj(i -> list.subList(i,  list.size()))
        .flatMap(l -> IntStream.rangeClosed(1, l.size()).mapToObj(i -> l.subList(0, i).stream().reduce(0, Integer::sum)))
        .collect(Collectors.toList());
[640, 1120, 1640, 1810, 2130, 2270, 2330, 480, 1000, 1170, 1490, 1630, 1690, 520, 690, 1010, 1150, 1210, 170, 490, 630, 690, 320, 460, 520, 140, 200, 60]