это часть моего кода ниже. Когда я использую цикл 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));
// }
Думаю, у меня просто неправильная реализация. Любые советы, как улучшить здесь? Спасибо!
IntStream.rangeClosed(1, rsmeta.getColumnCount())



Вы можете использовать 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));
}
Возможно ли создать список столбцов «на лету», а не только заполнять его? Можно ли улучшить?
Лучше бы....map(i -> rsmeta.getColumnName(i)).collect(Collectors.toList());. Однако я не уверен, что понял ваш вопрос сейчас.
List<String> columnNames = IntStream.rangeClosed(1, rsmeta.getColumnCount()).map(i -> rsmeta.getColumnName(i)).collect(Collectors.toList()); говорит, что несоответствие типов не может быть из строки в целое... и мне нужно использовать индекс внутри getColumnName... извините, если это глупый вопрос, я только начал изучать потоки
Очевидно, что в потоке вы начинаете с 0, а в цикле for вы начинаете с 1. В ResultSet столбцы индексируются с 1.