如何简化这个java的每个循环?



我试图简化下面的代码。

while(results.next())
for(String column : colNames){
if(EmptyUtil.isEmpty(results.getString(column))) {
emptyCount++;
}
}

if(emptyCount == colNames.size()){
break;
}
}

我的主要目标是读取CSV文件,直到一个空行,并从那里完成读取文件。这是必要的,我必须使用这个csvjdbc驱动程序)。

在上面的代码中,results是一个CsvResultSet(我使用Csvjdbc库来获得这个结果集)。这个CsvResultSet表示for循环内CSV文件中的单行。我要遍历CSV文件中的每一行bcolNames为CSV文件中的列头列表。通过使用results.toString(column),我可以获得行中特定单元格中的值。

如果行中所有的单元格都是空的,我应该跳出while循环。

以上代码按预期工作。我只需要知道如何把它简化。

试试这个

L: while(results.next()) {
for(String column : colNames){
if(!EmptyUtil.isEmpty(results.getString(column))) {
continue L;
}
}
// all the cells are empty in the row
break;
}

不确定这是否更简单,但也许更易于阅读:

while (results.next() && !allColumnsEmpty(results, colNames)) {
}

private boolean allColumsEmpty(ResultSet results, String...colNames) {
for(String column : colNames){
if(!EmptyUtil.isEmpty(results.getString(column))) {
return false;
}
}
return true;
}

我将使用流API来决定,并使用外部变量代替break

boolean wasEmptyRow = false;
while (!wasEmptyRow && results.next()) {
wasEmptyRow = colNames
.stream()
.map(column -> results.getString(column))
.allMatch(EmptyUtil::isEmpty);
if (! wasEmptyRow) {
// process
}
}

您只需从列名创建一个流,将所有值替换为result中的当前值,然后检查是否所有值都为空。allMatch是优化的,如果发现一个失败的情况,它将不会检查所有列。这将为您保存break

最新更新