如何根据特定条件将流分成多个流?

Sid*_*Sid 3 java-8 java-stream

我有一个整数列表,我想使用Java 8流从该列表返回整数子列表,其中我的子列表在遇到负整数之前就包含原始列表中的所有正整数

对于前。假设我的清单包含元素

[1 , 2 , 0 , -1 , 5 , 8 , 9 , -11 , 7 , 13 ]
Run Code Online (Sandbox Code Playgroud)

那我应该返回包含

  [1 , 2 , 0 ] [ 5 , 8 , 9 ] [7 , 13]  
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但是它不起作用,非常感谢您的指导和投入。

package Java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

public class StreamsExamples {

    public static void main(String[] args) {
        ArrayList<Integer> arr = new ArrayList<Integer>();
        arr.add(1);
        arr.add(2);
        Integer[] al = new Integer[]{0,-1,5,8,9,-11,7,13};
        arr.addAll(Arrays.asList(al));
        arr.stream().collect(Collectors.groupingBy(Functionality::getPositiveList));
        // arr.stream().collect(Collectors.toList()).;
        //arr.stream().sorted().forEach(System.out::print);
    }


}

class Functionality{

    public List<List<Integer>> getPositiveList(List<Integer> list){
        List<List<Integer>> li = new ArrayList<List<Integer>>();
        List<Integer> a = new ArrayList<Integer>();
        for(int i=0;i<list.size();i++) {
            if(list.get(i)>=0) {
                a.add(list.get(i));
            }
            else if (list.get(i)<0) {
                li.add(a);
                a.clear();
            }
        }
        return li;

    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

如果您在这里有所不同,这并不难:找出负值所在的索引,然后在它们subList之间做一个...有一些怪癖IntStream.of(-1)(但我会让您弄清楚为什么)就像这样:尝试以更直观的方式替换它, IntStream.of(0)看看发生了什么。因此输入如下:

ArrayList<Integer> arr = List.of(1, 2, 0, -1, 5, 8, 9, -11, 7, 13);
Run Code Online (Sandbox Code Playgroud)

您首先要找到索引:

int[] indexes = IntStream.concat(
IntStream.of(-1),
IntStream.concat(
      IntStream.range(0, arr.size())
               .filter(x -> arr.get(x) < 0),
      IntStream.of(arr.size())))
         .toArray();

System.out.println(Arrays.toString(indexes));
Run Code Online (Sandbox Code Playgroud)

结果将如下所示:[-1, 3, 7, 10]

因此,只需计算这些subList之间的:

IntStream.range(0, indexes.length - 1)
         .mapToObj(x -> arr.subList(indexes[x] + 1, indexes[x + 1]))
         .collect(Collectors.toList())
         .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)