如何在代码中仅使用流实现相同的逻辑,而不使用下面代码中所示的for循环.我试过使用flatMap,但我在条件部分卡住了,因为allMatch()只返回boolean.如何从2D ArrayList中检索通过条件而不使用for循环的所有行?

ArrayList<ArrayList<Tile>> completeRows = new ArrayList<>();
for (ArrayList<Tile> rows: getGridTiles()) {
    if (rows.stream().allMatch(p -> p.getOccupiedBlockType() != BlockType.EMPTY)) {
        completeRows.add(rows);
    }
}

推荐答案

您可以应用filter(),并将嵌套流(exactly the same as you've used as a condition in your code)作为Predicate传递给它,以验证列表仅包含non-empty个图块.

然后使用collect()收集已将predicate传递到列表中的所有列表(rows).

public static List<List<Tile>> getNonEmptyRows(List<List<Tile>> rows) {
    
    return rows.stream()
        .filter(row -> row.stream().allMatch(tile -> tile.getOccupiedBlockType() != BlockType.EMPTY))
        .collect(Collectors.toList()); // or .toList() with Java 16+
}

我试过用flatMap

当您的目标是将集合流(or objects holding a reference to a collection)扁平化为这些集合的元素流时,需要使用flatMap.在这种情况下,将瓷砖列表流Stream<List<Tile>>转变为瓷砖流Stream<Tile>.

从你的代码判断,这不是你想要的,因为你正在将rows个(瓷砖列表)累积到另一个列表中,而不是"flattening"个.

但以防万一,这就是如何做到的:

public static List<Tile> getNonEmptyTiles(List<List<Tile>> rows) {
    
    return rows.stream()
        .filter(row -> row.stream().allMatch(tile -> tile.getOccupiedBlockType() != BlockType.EMPTY))
        .flatMap(List::stream)
        .collect(Collectors.toList()); // or .toList() with Java 16+
}

Sidenote:利用抽象数据类型-根据接口编写代码.What does it mean to "program to an interface"?

Java相关问答推荐

如何在Java中设置字符串与中文字符对齐?

使用log 4j2格式的Hibernate 显示SQL日志(log)

Java事件系统通用转换为有界通配符

我的scala文件失败了Scala.g4 ANTLR语法

springboot start loge change

根据对象和值的参数将映射<;T、值&>转换为列表<;T&>

我无法将附件发送到NetBeans之外

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

RESTful框架类字段是安全的还是不安全的

Java编译器抛出可能未正确初始化的错误?

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

使用Jolt将字段转换为列表

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

在Java中将int[]矩阵添加到ArrayList中,但出现错误

如何处理两个几乎相同的XSD文件?

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在应用程序运行时更改LookAndFeel

我该如何为我的类编写getter和setter方法?

rest api服务 spring 启动中出现IllegalFormatConversionException