Java lambda filter и map, могу ли я избежать этих повторяющихся вызовов?

#java #lambda

#java #лямбда

Вопрос:

Я изучаю лямбды, и мне интересно узнать о следующем коде:

     ArrayList<String> lines = new ArrayList<>();
    lines.add("#ignored");
    lines.add("   #ignored2");
    lines.add("Not Ignored");
    lines.add("also not ignored");
    lines.add("   also Not Ignored but lower CASE");

    lines.stream()
            .filter(line -> !line.trim().startsWith("#"))
            .map(line -> line.trim().toLowerCase())
            .forEach(System.out::println);
 

вывод:

 not ignored
also not ignored
also not ignored but lower case
 

Как для строк фильтра, так и для строк карты я вызываю trim(), чтобы удалить все начальные или конечные пробелы.

Возможно ли здесь обрезать строку один раз, сохранить результат, а затем использовать этот результат на карте?

Комментарии:

1. Этот вопрос не показывает каких-либо исследовательских усилий; он неясен или бесполезен. Это ваша причина. Посетите Meta, если хотите получить еще больше информации.

Ответ №1:

Вы можете использовать map метод в начале, чтобы обрезать строки:

 lines.stream()
        .map(String::trim) // Trim the spaces
        .filter(line -> !line.startsWith("#"))
        .map(String::toLowerCase)
        .forEach(System.out::println);
 

Комментарии:

1. вы можете написать .map(String::trim) 🙂

2. то же самое с toLowerCase

3. @maxpovver Спасибо, я изменил ответ, чтобы использовать ссылки на методы.

Ответ №2:

Вы могли бы попробовать ниже

 lines.stream().map(String::trim).filter(line -> !line.startsWith("#")).map(String::toLowerCase).forEach(System.out::println);