JavaRush /Java блог /Random UA /Кава-брейк #163. У чому різниця між лямбдою та посиланням...

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

Стаття з групи Random UA

У чому різниця між лямбдою та посиланням на метод

Джерело: 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 найкраща. Але в реальних умовах необхідно комбінувати певні сценарії, а потім вибирати метод із найменшими втратами продуктивності.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ