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

时间:2019-06-16 04:04:48

标签: java-8 java-stream

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

例如假设我的列表中有元素

[[ ! 'foo.png' =~ \.(jpe?g|png)$ ]] && echo not a image

然后我应该返回包含

的子列表
class foo {
  int x;
  double y;
}

void main() {
  final a = List<foo>();

  List<foo> b;

  print(a.runtimeType);
  print(b.runtimeType);
}

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

[1 , 2 , 0 , -1 , 5 , 8 , 9 , -11 , 7 , 13 ]

2 个答案:

答案 0 :(得分:5)

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

IntStream.of(0)

您首先要找到索引:

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

这将产生类似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)); 的结果。

因此只需计算这些之间的[-1, 3, 7, 10]

subList

答案 1 :(得分:2)

这有点丑陋,但这可行:

List<List<Integer>> lists = Arrays.stream(arr).boxed()
    .reduce(
        new ArrayList<>(),
        (l, i) -> {
            if (l.isEmpty() || i < 0) {
                l.add(new ArrayList<>());
            }
            if (i >= 0) {
                l.get(l.size() - 1).add(i);
            }
            return l;
        }, (a, b) -> {
            a.addAll(b);
            return a;
        });

已测试:

int [] arr = {1, 2, 0, -1, 5, 8, 9, -11, 7, 13};

List<List<Integer>> lists = Arrays.stream(arr).boxed().reduce(new ArrayList<>(),
        (l, i) -> {
            if (l.isEmpty() || i < 0) {
                l.add(new ArrayList<>());
            }
            if (i >= 0) {
                l.get(l.size() - 1).add(i);
            }
            return l;
        }, (a, b) -> {
            a.addAll(b);
            return a;
        });

System.out.println(lists);

输出:

[[1, 2, 0], [5, 8, 9], [7, 13]]