В чем разница между лямбдой и ссылкой на метод
Источник: Reddit IntelliJ IDEA предлагает заменять лямбда-выражения ссылками на методы. В чем же разница между ними?
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.
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = Arrays.stream(values)
.filter(Objects::nonNull)
.collect(Collectors.joining());
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ