java 8 带流的嵌套循环

标签 java java-8 java-stream

我有一个 for 循环迭代 Integer [][]map 。 目前是这样的:

for(int i = 0; i < rows; i++) {
    for(int j = 0; j < columns; j++) {
        if(map[i][j] == 1)
            q.add(new Point(i,j));
    }
}        

假设我有 List<List<Integer>> maps2d 而不是二维数组。 我该如何使用流来做到这一点?

到目前为止我得到了这个:

maps2d.stream()
      .forEach(maps1d -> maps1d.stream()
                               .filter(u -> u == 1)
                               .forEach(u -> {

                               }
      )
);

到目前为止正确吗? 如果是,我怎么算ij为了创建new Point(i,j)并将其添加到 q

最佳答案

如果您确实想将流用于相同目的,那么一种选择是使用嵌套的 IntStream 来迭代索引。举个例子:

public static List<Point> foo(List<List<Integer>> map) {
  return IntStream.range(0, map.size()) // IntStream
      .mapToObj(
          i ->
              IntStream.range(0, map.get(i).size())
                  .filter(j -> map.get(i).get(j) == 1)
                  .mapToObj(j -> new Point(i, j))) // Stream<Stream<Point>>
      .flatMap(Function.identity()) // Stream<Point>
      .collect(Collectors.toList()); // List<Point>
}

就我个人而言,我不认为它具有很强的可读性。请注意,您仍然可以在列表中使用嵌套 for 循环,类似于您当前的解决方案:

public static List<Point> foo(List<List<Integer>> map) {
  List<Point> result = new ArrayList<>();
  for (int i = 0; i < map.size(); i++) {
    List<Integer> inner = map.get(i);
    for (int j = 0; j < inner.size(); j++) {
      if (inner.get(j) == 1) {
        result.add(new Point(i, j));
      }
    }
  }
  return result;
}

关于java 8 带流的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439950/

相关文章:

java - 如何在java中命名最终的List变量?

java - 我如何打印这个流?

Java 8 流和并行流

java - 是否可以使用 Java 8 Streams API 进行异步处理?

java - 禁用包含的 servlet 中的调度程序

java - 如何跨区域解析CopySnapshotRequest 'protocol must not be null'

java - 扫描仪缺少 .txt 文件的第一行

java - 在java 8中合并两个对象列表

java 8 流收集器映射 List<List> 到 List

Java-8 使用 lambda 过滤两个集合