Как скипнуть строку в потоке, которая начинается с символа?
Нужна помощь более опытных коллег) В общем, суть: считываем файл настроек и добавляем в карту. Метод делит строку по символу '=' на две строки, первая это ключ, вторая - значение. Метод не должен обрабатывать закомментированные строки, т. е. пропускать эту строку! Комментарий начинается со знака '#'. Всё никак не получается скипнуть строку с комментариями( Подскажите плз, вариант решения(
private final Map<String, String> values = new HashMap<>();
public void skip() {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
// br.lines().filter(s -> s.startsWith("#")).skip(1).
br.lines().filter(s -> s.contains("=")).forEach(s -> {
String[] keyValuePair = s.split("=", 2);
String key = keyValuePair[0];
String value = keyValuePair[1];
// if (key.startsWith("#")) {
//
// }
values.put(key, value);
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
файл 'path' с настройками:
#com.java=org.oracle.form
com.java=org.oracle
Ответы (1 шт):
Автор решения: kami
→ Ссылка
С учетом того, что в вашем исходном коде не допускается появление строк без =, т.е. не будет ключей без значения, преобразование можно записать так:
values = br.lines()
.filter(s -> !s.trim().startsWith("#")) // убираем комментарии, игнорируя стартовые пробелы
.filter(s -> s.contains("=")) // убираем строки, не содержащие разделитель
.collect(
Collectors.toUnmodifiableMap( // и сразу собираем в мап
s -> s.split("=", 2)[0], // ключем будет первая часть разделенной строки
s -> s.split("=", 2)[1], // значением вторая
//(мы можем это позволить, поскольку разделитель есть
// всегда, это гарантирует фильтр)
(s, s2) -> s // дубликаты ключей игнорируем
)
);