Как упростить эту 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 для тебя.

Другие вопросы по тегам