Как скипнуть строку в потоке, которая начинается с символа?

Нужна помощь более опытных коллег) В общем, суть: считываем файл настроек и добавляем в карту. Метод делит строку по символу '=' на две строки, первая это ключ, вторая - значение. Метод не должен обрабатывать закомментированные строки, т. е. пропускать эту строку! Комментарий начинается со знака '#'. Всё никак не получается скипнуть строку с комментариями( Подскажите плз, вариант решения(

   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 // дубликаты ключей игнорируем
        )
  );

→ Ссылка