我试图简化下面的代码。
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
。