en
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Open in Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg

Show more
6 814
Subscribers
-524 hours
-107 days
-6530 days
Posts Archive
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать прои
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать произвольное количество аргументов одного типа (от нуля и более). Данная возможность появилась в JDK 5. Запись вида Object... args и есть varargs. При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив. Альтернативой varargs является перегрузка методов или передача в метод массива значений. Varargs был создан с целью упрощения работы программиста, удобства и краткости кода. 📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.

✅ Тяжело найти хорошую работу Java-разработчика без знания архитектуры Микросервисов? ✅ Хочется охватить все компоненты этой
✅ Тяжело найти хорошую работу Java-разработчика без знания архитектуры Микросервисов? ✅ Хочется охватить все компоненты этой архитектуры и варианты их взаимодействия? ✔️ Перейти на новый уровень синьора, повысить знания по микросервисам, контейнерам и облачным технологиям? ✔️ Уверенно ориентироваться в "живых" проектах и технологиях на стеке Spring Cloud? ПРЕДЛАГАЕМ ПРОЙТИ ОТКРЫТЫЕ ЗАНЯТИЯ на расширенном курсе по всем основным темам микросервисной архитектуры: Java Микросервисы, Kafka, Docker, Spring Cloud, Spring WebFlux 🔥В реальном проекте, с выполнением и разбором домашних заданий. ВЫ ПОЛУЧИТЕ: ➕ Доступ навсегда ко всем материалам занятий и репозиториям микросервисов ➕ Персонализированную поддержку и живое общение в ТГ-группе с темами на каждое занятие ➕ Практику и примеры применения более 30-ти технологий на стеке Spring Cloud ➕ Огромный стек технологий в резюме и группа проектов в портфолио ИТОГ: ⚡️ Повышенная ценность, как Java-разработчика и новый уровень дохода ⚡️ Полное понимание компонентов микросервисов и их взаимодействия ⚡️ Электронный сертификат об окончании курса ⚡️ Поддержка в специальной группе Telegram, в том числе после завершения обучения Время прохождения не ограничено, материалы и поддержка даются навсегда. Первым 500 участникам СКИДКА 50% ЗАПИСАТЬСЯ ЗДЕСЬ ⬇️⬇️⬇️ https://t.me/JavaOPsBot?start=c-cloud=s-java_tips_and_tricks

⌨️ Использование java.util.stream.Collectors для обработки коллекций Код:
import java.util.List;
import java.util.stream.Collectors;

public class StreamCollectorsExample {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        // Примеры использования Collectors
        // Преобразование элементов коллекции в строку
        String numbersAsString = numbers.stream()
                                        .map(Object::toString)
                                        .collect(Collectors.joining(", "));
        System.out.println("Числа в виде строки: " + numbersAsString);
        
        // Получение среднего значения всех элементов коллекции
        double average = numbers.stream()
                                 .collect(Collectors.averagingInt(Integer::intValue));
        System.out.println("Среднее значение: " + average);
        
        // Фильтрация элементов и сборка их в новую коллекцию
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(num -> num % 2 == 0)
                                           .collect(Collectors.toList());
        System.out.println("Четные числа: " + evenNumbers);
        
        // Группировка элементов по условию
        System.out.println("Числа по остатку от деления на 3: " + numbers.stream()
                                                                      .collect(Collectors.groupingBy(num -> num % 3)));
    }
}
⚙️Этот пример демонстрирует использование класса Collectors из пакета java.util.stream для более эффективной обработки коллекций в Java. Методы класса Collectors предоставляют различные операции для сбора (collecting) элементов из потока данных в различные структуры данных или для выполнения агрегатных операций над элементами потока.

Онлайн-магистратура с IT специальностями от Яндекса Совместно с ИТМО, МИФИ, МФТИ. Онлайн-магистратура с актуальными программами и гибким графиком обучения. Получите высокооплачиваемую IT профессию, официальный диплом и практические знания. Господдержка оплаты. Совмещение с работой! Узнать больше #реклама 16+ О рекламодателе

⌨️ Switch Expressions В Java 12 появился новый синтаксис для switch, который позволяет возвращать значение используя стрелки ->, что делает код более компактным и удобным. Теперь switch может использоваться как выражение, а не только как оператор, что упрощает его применение в логике. Ранее switch использовался как оператор, и код мог выглядеть громоздко:

String day = "MONDAY";
int numLetters;
switch (day) {
    case "MONDAY":
    case "FRIDAY":
    case "SUNDAY":
        numLetters = 6;
        break;
    case "TUESDAY":
        numLetters = 7;
        break;
    default:
        numLetters = 8;
}
System.out.println(numLetters); // Вывод: 6
Со Switch Expressions можно переписать этот код более лаконично:

String day = "MONDAY";
int numLetters = switch (day) {
    case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
    case "TUESDAY" -> 7;
    default -> 8;
};
System.out.println(numLetters); // Вывод: 6
Теперь switch может вернуть значение, и нет необходимости в break. #java #switch

⌨️ Что такое static метод интерфейса? Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс. ✔️Статические методы в интерфейсе являются частью интерфейса без возможности переопределить их для объектов класса реализации; ✔️Методы класса java.lang.Object нельзя переопределить как статические; ✔️Статические методы в интерфейсе используются для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т.д. Вызывать static метод интерфейса можно используя имя интерфейса:

interface Paper {
    static void show() {
        System.out.println("static show()");
    }
}

class Licence {
    public void showPaper() {
        Paper.show();
    }
}

AI-агенты: новая волна автоматизации бизнеса 🔛 Бизнес все активнее внедряет AI-агентов, которые работают быстрее, дешевле и
AI-агенты: новая волна автоматизации бизнеса 🔛 Бизнес все активнее внедряет AI-агентов, которые работают быстрее, дешевле и без усталости. Это не просто чат-боты, а полноценные цифровые сотрудники, которые автоматизируют процессы в HR, финансах, маркетинге и других сферах. Админ канала Ai, работай! подготовил обзор российских и зарубежных решений: где AI-агенты уже зарабатывают деньги, как они трансформируют рынок и какие технологии стоит изучить сегодня, чтобы не остаться позади. Забирай PDF бесплатно: https://t.me/+xkf-cAO3EbM4ZjVi

⌨️ Что такое default методы интрефейса? Java 8 позволяет добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово default:

interface Example {
    int process(int a);
    default void show() {
        System.out.println("default show()");
    }
}
✔️Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию. ✔️Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется. ✔️Метод по умолчанию не может переопределить метод класса java.lang.Object. ✔️Помогают реализовывать интерфейсы без страха нарушить работу других классов. ✔️Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах. ✔️Дают свободу классам выбрать метод, который нужно переопределить. ✔️Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения. Вызывать default метод интерфейса в реализующем этот интерфейс классе можно используя ключевое слово super вместе с именем интерфейса:

interface Paper {
    default void show() {
        System.out.println("default show()");
    }
}

class Licence implements Paper {
    public void show() {
        Paper.super.show();
    }
}

🔍Тестовое собеседование на Middle Java-разработчика завтра 14 мая(уже сегодня!) в 19:00 по мск приходи онлайн на открытое со
🔍Тестовое собеседование на Middle Java-разработчика завтра 14 мая(уже сегодня!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Константин Лесняк, Java-разработчик с большим опытом проведения собесов, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Костя будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Косте Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.  Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzquWiHfz

⌨️ Что такое Heap и Stack память в Java? Какая разница между ними? Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения. Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел) Различия между Heap и Stack памятью: ✔️ Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы. ✔️ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче. ✔️ Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков. ✔️ Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы. ✔️ Если память стека полностью занята, то Java Runtime бросает исключение java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space. ✔️ Размер памяти стека намного меньше памяти в куче. ✔️ Из-за простоты распределения памяти, стековая память работает намного быстрее кучи. Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss. #java #heap #stack #memory

Сегодня QA.GURU анонсировали закрытый вебинар «Как Python открывает новые горизонты в карьере тестировщика». Обещают последние тренды QA, блок с лайфкодингом и живую сессию вопросов. ▶ По этой ссылке можно зарегистрироваться для бесплатного участия в этот четверг в 8 вечера мск. В программе: — Зачем ручным тестировщикам разбираться в автоматизации и почему Python — оптимальный старт; — Какие навыки выводят QA в топ в 2025 году (спойлер: нейросети пока не конкуренты); — Практика: пишем ручной тест, автоматизируем на Python, сравниваем Playwright, Selenium и Selene, запускаем с Pytest и без. Спикер, Станислав Васенков — QA, за плечами которого больше 10 лет автоматизации, ex-Head of QAA pflb.ru и автор библиотеки allure-notifications. Победитель хакатона по автоматизации тестирования от EPAM. Организатор конференций, спикер Heisenbug, основатель QA.GURU и AUTOTESTS.AI. Стас знает, о чём говорит — и умеет научить. 🔗 Забирайте ссылку. Кто успеет — тот в игре.

⌨️ Методы compose и andThen интерфейса Function Function<T,R> — функциональный интерфейс, который умеет принимать объект типа T и возвращать R. У него есть два метода-комбинатора:

default <V> Function<V,R> compose(Function<? super V,? extends T> before)
default <V> Function<T,V>   andThen(Function<? super R,? extends V> after)
🔵f.compose(g) → сначала выполняет g, потом результат передаёт в f. 🔵f.andThen(h) → сначала выполняет f, потом h. ✔️ Пример:

import java.util.function.Function;

public class ComposeAndThenDemo {
    public static void main(String[] args) {
        Function<String, Integer> parse  = Integer::parseInt;
        Function<Integer, Double> half   = i -> i / 2.0;
        Function<Double, String> toStr   = d -> "Result: " + d;

        // Составляем: сначала parse, затем half, затем toStr
        Function<String, String> pipeline =
            toStr
             .compose(half)      // toStr(half(x))
             .compose(parse);    // toStr(half(parse(x)))

        // То же самое через andThen:
        Function<String, String> pipeline2 =
            parse
             .andThen(half)      // half(parse(x))
             .andThen(toStr);    // toStr(half(parse(x)))

        System.out.println(pipeline.apply("42"));   // Result: 21.0
        System.out.println(pipeline2.apply("42"));  // Result: 21.0
    }
}
compose строит цепочку справа-налево (parse → half → toStr). ▸ andThen — слева-направо (parse → half → toStr).

Всем привет! Меня Влад зовут и я разработчик уже целых 8 лет. Последние 2 года работал в компании Uber в Амстердаме, а начинал, кстати, с полного нуля — обычным парнем из деревни. Если ты мечтаешь попасть в IT, круто зарабатывать и гордиться собой, но не веришь, что это вообще реально — я прекрасно тебя понимаю. Ты читаешь телеграм-каналы, смотришь ролики на YouTube, и все равно в голове бардак: слишком много всего, а что реально важно — не понятно. Кажется, без специального образования никуда, а страх бросить все на полпути только усиливается. Поверь, это абсолютно нормально. Я прошел ровно через то же самое и знаю, как помочь тебе не потеряться в море информации и сомнений. У меня есть решение — четкий и понятный план, как с нуля построить карьеру разработчика и не бросить на полпути, отказавшись от мечты. Расскажу, с чего начать, как не сдаться и как стать разработчиком, даже если этот путь кажется сложным и нереальным. Приходи на бесплатный вебинар — “Как начать зарабатывать 200 000₽ в IT за 6 месяцев: путь от нуля до первой работы. ЗАПИСАТЬСЯ НА ВЕБИНАР

⌨️ Описание и назначение разных циклов Цикл for со счетчиком

for (initialization; condition; update) {
    // тело цикла
}
Описание: initialization: выполняется один раз перед началом цикла. Обычно используется для инициализации счетчика. condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла. update: выполняется после каждой итерации. Обычно используется для изменения счетчика.

int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
    System.out.println(i + ": " + numbers[i]);
}
Применение: Используется, когда известно количество итераций заранее. Часто применяется для работы с массивами или коллекциями, когда нужен индекс. Цикл for-each

for (type element : collection) {
    // тело цикла
}
Описание: Итерируется по каждому элементу коллекции (например, массива, списка, множества). Обеспечивает удобный способ доступа к каждому элементу без использования индексов.

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);
}
Применение: Предпочтителен, когда не нужен доступ к индексам элементов. Цикл while

while (condition) {
    // тело цикла
}
Описание: condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.

String code = UUID.randomUUID().toString();
boolean isCodeExists = repo.isCodeExists(code);
while (isCodeExists) {
    code = UUID.randomUUID().toString();
    isCodeExists = repo.isCodeExists(code);
}
repo.saveCode(code);
Применение: Используется, когда количество итераций неизвестно заранее и определяется во время выполнения программы. Цикл может не выполниться ни одного раза. Цикл do-while

do {
    // тело цикла
} while (condition);
Описание: Выполняет тело цикла хотя бы один раз, а затем проверяет условие condition. Если условие истинно, цикл повторяется.

String command;
do {
    command = readCommand();
    doCommand(command);
} while (!"EXIT".equals(command));
Применение: Используется, когда тело цикла должно выполниться хотя бы один раз, независимо от условия. Часто применяется для меню или ввода данных, где сначала нужно выполнить действие, а затем проверить условие. #java #cycles #for #while

Ещё один канал про код? ❌ НЕТ: “Что такое ООП” ❌ НЕТ: “Топ-5 вопросов на собесе” ❌ НЕТ: “Почему монолит — это плохо” ✅ ДА: «К
Ещё один канал про код? ❌ НЕТ: “Что такое ООП”   ❌ НЕТ: “Топ-5 вопросов на собесе”   ❌ НЕТ: “Почему монолит — это плохо” ✅ ДА: «Как продать бизнесу рефакторинг»   ✅ ДА: «Как не утонуть в легаси»   ✅ ДА: «Как проектировать, а не тушить» Короче, канал для тех, кто уже умеет писать код и теперь пытается выжить в реальных проектах. erid: 2W5zFJa3bn8

☕️Работа с сохранением и загрузкой прогресса игрока в Java: сериализация данных 😎Задача:
🟢Сохранить состояние игрового объекта (например, класс Player) в файл. 🟢Загрузить данные из файла при старте игры. 🟢Обеспечить корректную работу даже при изменениях в структуре класса. 🟢Обработать возможные ошибки ввода-вывода.
😎Способы решения 🔢Стандартная сериализация Java (Serializable)
🟢Класс реализует интерфейс Serializable, и с помощью ObjectOutputStream и ObjectInputStream объекты записываются и читаются из файла.
🔢Использование JSON или XML
🟢Сериализация в человекочитаемый формат с помощью библиотек, например, Gson, Jackson (для JSON) или JAXB (для XML). Это удобно для отладки и совместимости.
🔢Кастомная сериализация
🟢Реализация собственных методов записи и чтения данных, например, через DataOutputStream/DataInputStream, что даёт больше контроля над форматом и размером файла.
😎Пример реализации на Java с использованием стандартной сериализации
import java.io.*;

class Player implements Serializable {
    private static final long serialVersionUID = 1L;
    String name;
    int level;
    int score;

    public Player(String name, int level, int score) {
        this.name = name;
        this.level = level;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Player{name='" + name + "', level=" + level + ", score=" + score + '}';
    }
}

public class SaveLoadGame {
    public static void savePlayer(Player player, String filename) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
            oos.writeObject(player);
            System.out.println("Прогресс сохранён.");
        } catch (IOException e) {
            System.err.println("Ошибка при сохранении: " + e.getMessage());
        }
    }

    public static Player loadPlayer(String filename) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
            return (Player) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            System.err.println("Ошибка при загрузке: " + e.getMessage());
            return null;
        }
    }

    public static void main(String[] args) {
        Player player = new Player("Игрок1", 5, 1500);
        String saveFile = "player.dat";

        savePlayer(player, saveFile);

        Player loadedPlayer = loadPlayer(saveFile);
        if (loadedPlayer != null) {
            System.out.println("Загруженный игрок: " + loadedPlayer);
        }
    }
}

☕️Интеграция звуковых эффектов и музыки в игру на Java 😎Задача:
🟢При разработке игр на Java требуется работать со звуком и музыкой. 🟢Нужно подключить звуковые звуки (эффекты и музыку) к игровому проекту. 🟢Реализовать звуковой сигнал в нужные моменты (например, выстрел, прыжок, победа). 🟢Обеспечить громкость и возможность паузы/продолжения музыки. 🟢Оптимизировать загрузку и меры для минимизации задержек и нагрузки на систему.
😎Способы решения 🔢Использование стандартного Java Sound API 🔢Библиотека
🟢javax.sound.sampled позволяет работать с аудиофайлами формата WAV, AIFF и др.
🔢Использование различных библиотек
🟢Например, LWJGL OpenAL , TinySound , JOAL — более мощные и гибкие решения для работы со звуком в играх, 3D-звуке, резервных источниках и других возможностях.
🔢Интеграция с игровыми движками
🟢Если используются игровые движки (например, LibGDX), он обычно предоставляет собственный удобный API для работы со звуком.
😎Пример на Java с использованием стандартного Java Sound API

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

public class SoundPlayer {

    private Clip clip;

    // Загрузка и подготовка звукового файла
    public void loadSound(String filepath) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filepath));
            clip = AudioSystem.getClip();
            clip.open(audioInputStream);
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            System.err.println("Ошибка загрузки звука: " + e.getMessage());
        }
    }

    // Воспроизведение звука
    public void play() {
        if (clip == null) return;
        if (clip.isRunning()) clip.stop();
        clip.setFramePosition(0);
        clip.start();
    }

    // Остановка звука
    public void stop() {
        if (clip != null && clip.isRunning()) {
            clip.stop();
        }
    }

    // Регулировка громкости (от 0.0 до 1.0)
    public void setVolume(float volume) {
        if (clip == null) return;
        FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        float dB = (float)(Math.log10(volume) * 20);
        gainControl.setValue(dB);
    }

    public static void main(String[] args) {
        SoundPlayer sound = new SoundPlayer();
        sound.loadSound("jump.wav"); // Замените на путь к вашему звуковому файлу
        sound.setVolume(0.5f);
        sound.play();

        // Для демонстрации задержка перед завершением программы
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        sound.stop();
    }
}

⌨️ Ссылки на методы — это способ упрощенного вызова методов или конструктора, который позволяет передавать их как аргументы в методы или сохранять в переменных. Ссылки на методы появились в Java 8 и являются частью улучшенной поддержки функционального программирования в языке. Есть несколько видов ссылок на методы: 1️⃣ Ссылка на статический метод Используется для вызова статических методов класса. Синтаксис:

ContainingClass::staticMethodName
Пример:

import java.util.function.Function;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Function<String, Integer> converter = Integer::parseInt;
        Integer number = converter.apply("123");
        System.out.println(number); // 123
    }
}
2️⃣ Ссылка на метод экземпляра конкретного объекта Используется для вызова методов экземпляра объекта. Синтаксис:

containingObject::instanceMethodName
Пример:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.forEach(System.out::println);
    }
}
3️⃣ Ссылка на метод экземпляра произвольного объекта определенного типа Синтаксис:

ContainingType::methodName
Пример:

import java.util.function.Function;

public class FunctionExample {
    public static void main(String[] args) {
        Function<String, Integer> stringLength = String::length;
        Integer length = stringLength.apply("Hello, World!");
        System.out.println(length); // 13
    }
}
Отличие от предыдущего вида в том, что в предыдущем ссылка на метод получается у конкретного объекта, стало быть вызовется метод этого объекта, а в нашем случае при получении ссылки на метод, мы знаем только метод, но объект у которого вызовется этот метод еще не известен, он будет предоставлен при вызове метода. Код выше будет означать "Hello, World!".length() 4️⃣ Ссылка на конструктор Используется для вызова конструктора. Синтаксис:

ClassName::new
Пример:

import java.util.function.Supplier;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Supplier<MethodReferenceExample> exampleSupplier = MethodReferenceExample::new;
        MethodReferenceExample example = exampleSupplier.get();
        System.out.println(example); // MethodReferenceExample@<hashcode>
    }
}
#java #MethodReference