JavaRush /Java блог /Random /Кофе-брейк #163. В чем разница между лямбдой и ссылкой на...

Кофе-брейк #163. В чем разница между лямбдой и ссылкой на метод. 5 способов конкатенации String Null в Java

Статья из группы Random

В чем разница между лямбдой и ссылкой на метод

Источник: Reddit IntelliJ IDEA предлагает заменять лямбда-выражения ссылками на методы. В чем же разница между ними? Кофе-брейк #163. В чем разница между лямбдой и ссылкой на метод. 5 способов конкатенации String Null в Java - 1Оказывается, существует тонкая разница между лямбда-выражениями и ссылками на методы. Например, сравните: myInstance::getStuff и () ->myInstance.getStuff(). В целом оба варианта эквивалентны друг другу. Но если myInstance окажется null, а лямбда выдаст null pointer (нулевой указатель) при оценке лямбды, то ссылка на метод будет сгенерирована сразу же при попытке доступа к ссылке. И что? Вообще, это важно, если код, оценивающий лямбда-выражение, находится внутри try-catch с нулевым указателем. Например, у меня есть функция mightBeNull(Supplier<T> function), которая делает что-то вроде этого:

try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
Если вызов mightBeNull(() -> myNullVariable.getStuff()) будет работать без исключений, то “эквивалент”: mightBeNull(myNullVariable::getStuff) вызовет исключение NullPointerException сразу при вызове функции. Вот в чем разница. Примечание. Согласно Stackoverflow, если заменить лямбду на ссылку на метод, то байткод класса будет компактнее, а значит, класс быстрее загрузится в JVM. Однако для того, чтобы ощутить такой прирост, нужны тысячи неоптимизированных лямбд. Тем не менее, в крупном проекте такое количество наберется легко. В остальном выбор между лямбдой и ссылкой на метод — вопрос вкуса и читаемости кода. Например, если в лямбде несколько строк, то читаемость снижается, и код только выиграет, если лямбду вынести в отдельный метод, и использовать ссылку на него.

5 способов конкатенации String Null в Java

Источник: Gitconnected Прочитав эту публикацию, вы узнаете дополнительные способы работы со строками в ​​Java. Java предоставляет множество способов объединения строк, но иногда, когда мы не обращаем внимания на строки null, то мы можем получить в результате null, что, очевидно, совсем не то, что нам нужно. Поэтому используйте рекомендуемые мною способы избежать null значений при объединении файлов String.

Анализ проблемы

Если мы хотим объединить массивы строк, мы можем просто использовать оператор +. Однако при этом мы можем столкнуться со значениями null.

String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
Объединение всех этих элементов приводит нас к такому результату:
https://gist.github.comnull
Хотя мы нашли проблему, итоговое значение null также объединяется в виде строки, а это явно не то, на что мы рассчитываем. И даже если мы работаем на Java 8 или выше, используя статический метод String.join() для объединения строк, мы все равно получим результат со значениями null.

String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
Итог тот же:
https://gist.github.comnull
Итак, как решить эту проблему? Есть несколько решений. Чтобы облегчить последующую демонстрацию кода, мы извлекаем метод, который может передавать строку и возвращать ненулевую строку.

public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat() — это метод, который поставляется с классом String. Он очень удобен для конкатенации строк.

for (String value : values) {
    result = result.concat(getNonNullString(value));
}
Поскольку вызывается метод nullToString(), в результате нет null значений.

2. StringBuilder

Класс StringBuilder предоставляет множество полезных и удобных методов построения строк. Наиболее часто используемый среди них — это метод append(), который использует append() для объединения строк и сочетается с методом nullToString(), во избежание null значений.

String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
В итоге можно получить следующий результат:
https://gist.github.com

3. Класс StringJoiner (Java 8+)

Класс StringJoiner предоставляет более мощную функцию объединения строк. Он может не только указать разделитель во время объединения, но также указать префикс и суффикс. При соединении строк мы можем использовать его метод add(). Здесь также будет использоваться метод nullToString(), чтобы избежать null значений.

String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. Streams.filter (Java 8+)

Stream API — это мощный класс операций с потоками, представленный в Java 8, который может выполнять стандартную фильтрацию, сопоставление, обход, группировку, статистику и другие операции.
  • Операция фильтрации filter может получить функцию Predicate.
  • Интерфейс функции Predicate такой же, как интерфейс Function, представленный ранее.
  • Это функциональный интерфейс.
  • Он может принимать универсальный параметр <T>, а возвращаемое значение имеет логический тип (Boolean type).
  • Predicate часто используется для данных filter.
Таким образом, мы можем определить Predicate для проверки null строки и передать ее методу filter() из Stream API. Кроме того, вы можете использовать метод Collectors.joining() метод, чтобы соединить оставшиеся non-null строки.

String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5. Используйте оператор +

Использование оператора + также может решить проблему, но он не рекомендуется. Мы знаем, что String — неизменяемый объект. Использование знака + часто создает строковый объект, и каждый раз в памяти создается новая строка, поэтому потребление производительности при использовании знака + для соединения строк очень велико.

Заключение

В этой статье представлены несколько способов объединения строк и обработки NULL, в которых разные способы могут подходить для разных сценариев. Анализ показывает, что производительность StringBuilder наилучшая. Но в реальных условиях необходимо комбинировать определенные сценарии, а затем выбирать метод с наименьшими потерями производительности.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Уровень 51
29 сентября 2022