Любые советы, как улучшить мою реализацию?

это часть моего кода ниже. Когда я использую цикл for (закомментирован) - он работает. Когда я использую этот поток - он работает, но потом ведет себя плохо по методу, которого я никогда не ожидал.

        Spravochnik spr = new Spravochnik();
        ResultSetMetaData rsmeta = rs.getMetaData();
        List<String> columnNames = new ArrayList<>();
        List<List<String>> valuesInRows = new ArrayList<List<String>>();
        int columnCount = rsmeta.getColumnCount();

        IntStream.range(0, rsmeta.getColumnCount()).forEach(i -> {
            try {
                columnNames.add(rsmeta.getColumnName(i));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        });

//      for(int column = 1; column <= columnCount; column++){
//          columnNames.add(rsmeta.getColumnName(column));
//      }

Думаю, у меня просто неправильная реализация. Любые советы, как улучшить здесь? Спасибо!

Очевидно, что в потоке вы начинаете с 0, а в цикле for вы начинаете с 1. В ResultSet столбцы индексируются с 1.

NeplatnyUdaj 26.04.2019 11:50
IntStream.rangeClosed(1, rsmeta.getColumnCount())
Lino 26.04.2019 11:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать IntStream.range(1, rsmeta.getColumnCount()+1), который даст вам номера столбцов, начиная с 1 и заканчивая общим количеством.

Ответ принят как подходящий

Вы должны быть осторожны, какие числа в цикле или потоковой передаче включены, а какие нет.

  • IntStream::range(int startInclusive, int endExclusive) соответствует интервалу <a, b)
  • IntStream::rangeClosed(int startInclusive, int endInclusive) соответствует интервалу <a, b>

Обратите внимание, что первое число всегда включает, и, поскольку вы зацикливаетесь с 1, вы также хотите начать Stream с 1:

IntStream.range(1, rsmeta.getColumnCount()).forEach(i -> {
    // ...
});

Наконец, польза от использования Stream здесь довольно сомнительна. На самом деле, выгода нет вообще есть. Я настоятельно рекомендую придерживаться for-loop в этом случае использования:

for (int column = 1; column <= columnCount; column++) {
    columnNames.add(rsmeta.getColumnName(column));
}

Возможно ли создать список столбцов «на лету», а не только заполнять его? Можно ли улучшить?

Nikrango 26.04.2019 13:41

Лучше бы....map(i -> rsmeta.getColumnName(i)).collect(Collectors.toList());. Однако я не уверен, что понял ваш вопрос сейчас.

Nikolas Charalambidis 26.04.2019 13:48
List<String> columnNames = IntStream.rangeClosed(1, rsmeta.getColumnCount()).map(i -> rsmeta.getColumnName(i)).collect(Collectors.toList()); говорит, что несоответствие типов не может быть из строки в целое... и мне нужно использовать индекс внутри getColumnName... извините, если это глупый вопрос, я только начал изучать потоки
Nikrango 26.04.2019 14:07

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