如何在scala的for循环中应用continue并产生多个值?

Met*_*ata 0 java scala short-circuiting

我正在尝试将 java 程序的模块转换为 Scala。到目前为止,我已经能够在我转换的每个模块中应用 Scala 的函数式编程范式及其语法。但是我遇到了一种可以进行一些验证、使用continue并最终yield输出的方法。下面是Java中的代码:

public boolean checkColumn(String server, String database, String schema, String table, String column) {
        boolean bServer, bDatabase, bSchema, bTable, bColumn, bRet = false;
        for (int i = 0; i < columns.length; i++) {
            if ((server == null) || (server.length() == 0)) {
                bServer = true;
            } else {
                bServer = columns[i][0].equalsIgnoreCase(server);
            }
            if (!bServer) continue;

            if ((database == null) || (database.length() == 0)) {
                bDatabase = true;
            } else {
                bDatabase = columns[i][1].equalsIgnoreCase(database);
            }
            if (!bDatabase) continue;

            if ((schema == null) || (schema.length() == 0)) {
                bSchema = true;
            } else {
                bSchema = columns[i][2].equalsIgnoreCase(schema);
            }

            if (!bSchema) continue;

            bTable = columns[i][3].equalsIgnoreCase(table);
            if (!bTable) continue;

            bColumn = columns[i][4].equalsIgnoreCase(column);
            if (!bColumn) continue;

            bRet = true;
            break;
        }
        return bRet;
    }
Run Code Online (Sandbox Code Playgroud)

虽然我知道continue在 Scala 的最新版本中没有,但我能够理解如何在 Scala 中编写相同的代码。我尝试构建一个 for 循环,如下所示:

val finalReturn = for {i <- 0 until columns.length
    
} yield bRet
Run Code Online (Sandbox Code Playgroud)

但是想不出一种方法来形成所有 if 条件 &continue在 for 循环内的逻辑。谁能告诉我如何在 Scala 中编写相同的代码?

Tim*_*Tim 5

您正在检查(至少)其中一个columns匹配所有测试。这是exists操作:

def checkColumn(server: String, database: String, schema: String, table: String, column: String) = {
  columns.exists { col =>
    (server.isEmpty || col(0).equalsIgnoreCase(server)) &&
    (database.isEmpty || col(1).equalsIgnoreCase(database)) &&
    (schema.isEmpty || col(2).equalsIgnoreCase(schema)) &&
    col(3).equalsIgnoreCase(table) &&
    col(4).equalsIgnoreCase(column)
  }
Run Code Online (Sandbox Code Playgroud)

这将依次检查每个元素,直到其中一列通过所有测试(将返回true)或列表用尽,这将返回false

  • 干净多了。 (2认同)