Как упростить эту java для каждого цикла?
Я пытаюсь упростить следующий код.
while(results.next())
for(String column : colNames){
if(EmptyUtil.isEmpty(results.getString(column))) {
emptyCount++;
}
}
if(emptyCount == colNames.size()){
break;
}
}
Моя основная цель - прочитать CSV-файл до пустой строки и завершить чтение оттуда. И мне необходимо использовать этот драйвер Csvjdbd).
В приведенном выше коде
results
это
CsvResultSet
(Я использовал библиотеку Csvjdbc, чтобы получить этот набор результатов). Этот CsvResultSet представляет одну строку в файле CSV внутри цикла for. Обычно я просматриваю каждую строку в файле CSV. B
colNames
это список заголовков столбцов в CSV. Используя
results.toString(column)
, Я могу получить значение в конкретной ячейке в строке.
Если все ячейки в строке пусты, я должен выйти из цикла while.
Приведенный выше код работает должным образом. Мне просто нужно знать, как это еще больше упростить.
3 ответа
Попробуй это.
L: while(results.next()) {
for(String column : colNames){
if(!EmptyUtil.isEmpty(results.getString(column))) {
continue L;
}
}
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;
}
Я бы использовал Stream API для принятия решения и внешнюю переменную вместо.
boolean wasEmptyRow = false;
while (!wasEmptyRow && results.next()) {
wasEmptyRow = colNames
.stream()
.map(column -> results.getString(column))
.allMatch(EmptyUtil::isEmpty);
if (! wasEmptyRow) {
// process
}
}
Вы просто создаете поток из имен столбцов, заменяете все значения текущим значением из
result
, затем проверьте, все ли они пусты. В
allMatch
оптимизирован, он не будет проверять все столбцы, если обнаружен один сбойный случай. Это спасает
break
для тебя.