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

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

Ir al canal en Telegram

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

Mostrar más
6 953
Suscriptores
-324 horas
-27 días
+630 días
Archivo de publicaciones
☕️Библиотека Java: MapStruct
🗂MapStruct это генератор кода для маппинга между Java-бинами, который создает реализации mapper-ов на этапе компиляции.
🗂Основные преимущества:
1. 🗣Автоматический маппинг полей с одинаковыми именами 2. 🗣Высокая производительность (нет рефлексии в runtime) 3. 🗣Поддержка сложных преобразований 4. 🗣Интеграция с Spring и CDI
🗂Пример использования:
@Mapper(componentModel = "spring")
public interface UserMapper {
    
    @Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())")
    @Mapping(target = "status", constant = "ACTIVE")
    UserDto toDto(User user);
    
    @Mapping(target = "firstName", source = "fullName.split(\" \")[0]")
    @Mapping(target = "lastName", source = "fullName.split(\" \")[1]")
    User toEntity(UserDto dto);
}
🗂Ключевые особенности:
-💬 Генерация чистого Java-кода без зависимостей -💬 Поддержка коллекций и потоков -💬 Преобразование типов -💬 Работа с вложенными объектами -💬 Кастомные методы маппинга
🗣Интеграция с Spring:
@Service
@RequiredArgsConstructor
public class UserService {
    private final UserMapper userMapper;
    
    public UserDto createUser(UserRequest request) {
        User user = userMapper.toEntity(request);
        // бизнес-логика
        return userMapper.toDto(user);
    }
}

☕️Лямбда-выражения и Stream API
💻Лямбда-выражения и Stream API кардинально изменили подход к обработке данных в Java, позволив писать более декларативный и выразительный код.
🗂Пример без лямбд:

List<String> names = Arrays.asList("John", "Alice", "Bob");
Collections.sort(names, new Comparator() {
    @Override
    public int compare(String a, String b) {
        return a.compareTo(b);
    }
});
🗂С лямбда-выражением:

List<String> names = Arrays.asList("John", "Alice", "Bob");
names.sort((a, b) -> a.compareTo(b));
🔵Stream API позволяет выполнять сложные операции над коллекциями:

List<String> filteredNames = names.stream()
    .filter(name -> name.length() > 3)
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());
🗂Ключевые преимущества:
1.⏺ Упрощение работы с коллекциями 2.⏺ Возможность цепочечных вызовов методов 3.⏺ Параллельная обработка через parallelStream() 4.⏺ Ленивое выполнение операций
🗂Примеры: 1.🔅 Фильтрация и преобразование:

List<Product> expensiveProducts = products.stream()
    .filter(p -> p.getPrice() > 1000)
    .map(p -> p.withDiscount(0.1))
    .collect(Collectors.toList());
2.🟡 Группировка данных:

Map<String, List<Employ>> employeesByDepartment = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment));
3.💬 Статистические операции:

IntSummaryStatistics stats = salaries.stream()
    .mapToInt(Integer::intValue)
    .summaryStatistics();
🗂Особенности работы:
- 💬Stream не изменяет исходную коллекцию - 💬Многие операции возвращают новый Stream - 💬Терминальные операции завершают цепочку - 💬Оптимизированная работа с памятью

☕️Фишка Java: Optional для Null-Safety
⚙️Работа с null-значениями традиционно была источником ошибок в Java. Класс Optional предоставляет более элегантный способ обработки потенциально отсутствующих значений.
💬Традиционный подход:

User user = getUserById(id);
if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        String city = address.getCity();
        if (city != null) {
            System.out.println(city.toUpperCase());
        }
    }
}
💻С использованием Optional:

Optional.ofNullable(getUserById(id))
    .map(User::getAddress)
    .map(Address::getCity)
    .ifPresent(city -> System.out.println(city.toUpperCase()));
💻Основные методы Optional:
1.⏺ ofNullable() - создает Optional из значения, которое может быть null 2.⏺ map() - преобразует значение, если оно присутствует 3.⏺ orElse() - предоставляет значение по умолчанию 4.⏺ ifPresent() - выполняет действие, если значение есть 5.⏺ orElseThrow() - бросает исключение, если значения нет
🗂Примеры: 1.🔐 Безопасное получение вложенных свойств:

String cityName = Optional.ofNullable(order)
    .map(Order::getCustomer)
    .map(Customer::getAddress)
    .map(Address::getCity)
    .orElse("Unknown");
2. 🗂Комбинация нескольких Optional:

Optional<Double> totalPrice = Optional.ofNullable(order1)
    .flatMap(o1 -> Optional.ofNullable(order2)
        .map(o2 -> o1.getPrice() + o2.getPrice()));
3. 🗂Работа с коллекциями:

List<String> names = Optional.ofNullable(userList)
    .orElse(Collections.emptyList())
    .stream()
    .map(User::getName)
    .filter(Objects::nonNull)
    .collect(Collectors.toList());
🗂Преимущества использования Optional:
1.⏺ Явное указание на возможность отсутствия значения 2.⏺ Устранение проверок на null в коде 3.⏺ Четкая цепочка преобразований 4.⏺ Более читаемый и выразительный код

⚡️ Linux теперь в Telegram! Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работ
+4
⚡️ Linux теперь в Telegram! Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами Подписывайтесь: @linuxos_tg

☕️ JGraphT 🔄JGraphT - это мощная библиотека для работы с графами в Java. Она предоставляет широкий спектр алгоритмов и структур данных для решения задач, связанных с теорией графов. ✔️ Пример: Поиск кратчайшего пути в взвешенном графе

import org.jgrapht.Graph;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph;

public class RoadNetworkExample {
    public static void main(String[] args) {
        // Создаем взвешенный граф
        Graph roadNetwork = 
            new SimpleWeightedGraph<>(DefaultWeightedEdge.class);

        // Добавляем города (вершины)
        roadNetwork.addVertex("Москва");
        roadNetwork.addVertex("Санкт-Петербург");
        roadNetwork.addVertex("Нижний Новгород");
        roadNetwork.addVertex("Казань");

        // Добавляем дороги (ребра) с расстояниями
        roadNetwork.setEdgeWeight(roadNetwork.addEdge("Москва", "Санкт-Петербург"), 700);
        roadNetwork.setEdgeWeight(roadNetwork.addEdge("Москва", "Нижний Новгород"), 400);
        roadNetwork.setEdgeWeight(roadNetwork.addEdge("Нижний Новгород", "Казань"), 400);
        roadNetwork.setEdgeWeight(roadNetwork.addEdge("Санкт-Петербург", "Казань"), 1500);

        // Находим кратчайший путь
        DijkstraShortestPath dijkstraAlg = 
            new DijkstraShortestPath<>(roadNetwork);
        var path = dijkstraAlg.getPath("Москва", "Казань");

        System.out.println("Кратчайший путь: " + path.getVertexList());
        System.out.println("Общее расстояние: " + path.getWeight() + " км");
    }
}
🛠JGraphT предоставляет мощные инструменты для работы с графами, что делает его незаменимым для решения задач оптимизации, анализа сетей и многих других областей, где применяется теория графов.

⚡ Новые каналы с вакансиями и стажировками для джунов В этих каналах публикуются все свежие вакансии и стажировки 🔺 ВАКАНСИИ
Новые каналы с вакансиями и стажировками для джунов В этих каналах публикуются все свежие вакансии и стажировки 🔺 ВАКАНСИИ
Горячие вакансии с привлекательными офферами для джуниор разработчиков, аналитиков, дизайнеров и QA-специалистов.
👉 ПОДПИСАТЬСЯ 🔺СТАЖИРОВКИ
Стажировки для начинающих специалистов в IT независимо от возраста!
👉 ПОДПИСАТЬСЯ 🔺IT interns
Свежие стажировки для junior специалистов в топовых компании России и мира
👉 ПОДПИСАТЬСЯ 🔺Junojobs
Вакансии и стажировки для junior-разработчиков на удалёнке.
👉 ПОДПИСАТЬСЯ 🔺БИГТЕХ
Junior вакансии и стажировки в крупнейших IT-компаниях мира: NVidia, Apple, T-банк, Яндекс, Google и т. д.
👉 ПОДПИСАТЬСЯ 🔺Макс из < codereview />
Эксперименты про трудоустройство в IT, советы для быстрого поиска работы и офферы для джунов.
👉 ПОДПИСАТЬСЯ

☕️Библиотека Java: AssertJ
💻AssertJ — это библиотека для написания fluent-assertions в тестах, которая предоставляет удобный и читаемый синтаксис для проверок. Основные возможности:
1. ⏺Богатый набор утверждений для всех стандартных типов 2. ⏺Поддержка коллекций, массивов, Optional, дат 3. ⏺Расширяемый API для кастомных проверок 4. ⏺Читаемый синтаксис с цепочкой вызовов 🗂Примеры :
// Проверки строк
assertThat("Hello Java")
    .startsWith("Hello")
    .endsWith("Java")
    .hasSize(10)
    .contains(" ");

// Проверки коллекций
assertThat(userList)
    .hasSize(3)
    .extracting(User::getName)
    .containsExactly("Alice", "Bob", "Charlie");

// Проверки исключений
assertThatThrownBy(() -> service.process(null))
    .isInstanceOf(IllegalArgumentException.class)
    .hasMessage("Parameter cannot be null");
🗂Расширенные возможности: 1.🗣 Для дат и времени:
assertThat(localDate)
    .isAfter("2023-01-01")
    .isBeforeOrEqualTo("2023-12-31");
2.🗣 Для Optional:
assertThat(optionalValue)
    .isPresent()
    .contains("expected");
3.🗣 Кастомные проверки:
assertThat(book)
    .matches(b -> b.getPages() > 100, "толстая книга")
    .matches(b -> b.getAuthor() != null, "имеет автора");
🟦Преимущества перед JUnit Assert:
1. 💬Более информативные сообщения об ошибках 2. 💬Поддержка цепочек проверок 3. 💬Встроенные проверки для коллекций 4. 💬Удобная работа с исключениями 5. 💬Поддержка Java 8+ features

Каждый день без изучения ИИ — это упущенная возможность Пока другие осваивают нейросети и зарабатывают на этом, вы тратите время впустую. Канал «That's IT» — проводник в мире технологий, интернет-культуры, трендов и нейросетей. Здесь вы найдете: — Ежедневные дайджесты главных новостей ИИ. — Эксклюзивные инсайты о разработках и технологиях — Айтишный юмор и немного милых котиков Подписывайтесь и читайте самое важное из мира искуственного интеллекта: @thats_it_ai_tech

☕️ Lambda - выраженияОдной из наиболее полезных фишек в Java, которая упрощает написание кода, является: 🔴Lambda-выражения. Позволяют писать код более кратко и читаемо, особенно при работе с функциональными интерфейсами. ❔Что такое Lambda-выражения? 🖌Lambda-выраженияэто анонимные функции, которые могут принимать аргументы и возвращать значения. Они похожи на методы, но не имеют имени и могут быть определены прямо в теле метода. Это позволяет упростить код, удалив ненужную обертку. 📁 Пример использования Lambda-выражений
// Без Lambda
File directory = new File("./src/main/java");
String[] list = directory.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".java");
    }
});

// С Lambda
File directory = new File("./src/main/java");
String[] list = directory.list((dir, name) -> name.endsWith(".java"));
📈 Преимущества Lambda-выражений 1. 🔺Уменьшение количества кода: Lambda-выражения позволяют избежать создания анонимных классов, что делает код более лаконичным. 2. 🔺Улучшение читаемости: Код становится более понятным, так как основное внимание уделяется логике, а не обертке. 3.🔺 Упрощение работы с функциональными интерфейсами: Lambda-выражения идеально подходят для реализации функциональных интерфейсов, которые имеют только один абстрактный метод.

Время автоматизировать QA на JavaScript 🌚 Автоматизация шагает вперед: спрос на автотесты на JS продолжает расти!  По данным последнего опроса Stack Overflow, больше 60% QA-инженеров начинают карьеру с изучения JS. И даже фреймворк Allure 3, который раньше ассоциировался в основном с Java, теперь переписан на JavaScript. В этот четверг в 20:00 (мск) у школы QA-инженеров QA.GURU пройдет вебинар по автоматизации тестирования на JavaScript.  👉 На занятии вы узнаете о профессии QA и трендах профессии.  👉 Поработаете с фреймворком Playwright. 👉 Напишете и запустите свой автотест на JS.  А еще после урока вас ждет полноценная домашка, которую проверит преподаватель школы. Все участники вебинара получат обратную связь по ДЗ. 🔗 Зарегистрируйтесь на открытый урок, чтобы получить ссылку на трансляцию. Попробуйте себя в новой профессии!

⌨️ Неочевидный момент: Переполнение при умножении Integer В Java тип int (и его обёртка Integer) имеют фиксированный размер 32 бита. Если происходит переполнение (overflow), Java не выбрасывает ошибку, а просто "заворачивает" число. ✔️ Пример:

public class OverflowTest {
    public static void main(String[] args) {
        int max = Integer.MAX_VALUE; // 2147483647
        int result = max * 2; // Переполнение!
        
        System.out.println("Max: " + max); // Max: 2147483647
        System.out.println("Result: " + result); // Result: -2
    }
}
Почему? Потому что переполнение не вызывает ошибку — результат выходит за границу int и сбрасывается. ✔️ Что бы проверить переполнение используйте Math.multiplyExact():

public class SafeMultiply {
    public static void main(String[] args) {
        try {
            int safeResult = Math.multiplyExact(Integer.MAX_VALUE, 2);
            System.out.println(safeResult);
        } catch (ArithmeticException e) {
            System.out.println("Переполнение!");
        }
    }
}
Теперь при переполнении выбросится ArithmeticException.

Вы ведь тоже хотите изучать программирование с легкостью и вдохновением? Мой коллега из FAANG открыл свои каналы, где объясня
Вы ведь тоже хотите изучать программирование с легкостью и вдохновением? Мой коллега из FAANG открыл свои каналы, где объясняет сложные темы простым языком, дерзайте 🔥 🐍 Ghostly Python - Разбираем код, автоматизируем рутину, пишем ботов, скрипты и полезные утилиты. Все что нужно для уверенного старта в программировании на Python. ☕️ Easy Java - вскрываем Java изнутри. Все тонкости этого универсального языка в одном канале, врывайся! 😎 IT Syndicate - петабайты свежего материала по всем направлениям. Backend, DevOps, Frontend - и это лишь малая часть..

☕️ Javassist 🌐Javassist - это мощная библиотека для манипуляции байткодом Java во время выполнения программы. Она позволяет динамически создавать и модифицировать классы и методы без необходимости перекомпиляции исходного кода. 💎Пример: Добавление логирования ко всем методам класса

import javassist.*;

public class LoggingExample {
    public static void main(String[] args) throws Exception {
        // Получаем пул классов
        ClassPool pool = ClassPool.getDefault();

        // Получаем класс, который хотим модифицировать
        CtClass ctClass = pool.get("com.example.MyClass");

        // Получаем все методы класса
        CtMethod[] methods = ctClass.getDeclaredMethods();

        for (CtMethod method : methods) {
            // Добавляем логирование в начало каждого метода
            method.insertBefore("System.out.println(\"Вызван метод: " + method.getName() + "\");");

            // Добавляем логирование в конец каждого метода
            method.insertAfter("System.out.println(\"Метод " + method.getName() + " завершен\");");
        }

        // Заменяем оригинальный класс модифицированным
        ctClass.toClass();

        // Теперь при использовании MyClass все его методы будут логироваться
        // Например:
        // MyClass obj = new MyClass();
        // obj.someMethod();
    }
}
🛠Javassist предоставляет мощные инструменты для метапрограммирования в Java. Это делает его незаменимым для разработки фреймворков, систем аспектно-ориентированного программирования и инструментов профилирования.

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

⚡️ Как ускорить работу HashMap? HashMap – одна из самых эффективных структур, но её можно ещё ускорить. ✔️ 3 способа оптимизации: 🟢Задавайте начальный размер – по умолчанию HashMap увеличивается при заполнении на 75%, что может приводить к перераспределению. Укажите new HashMap<>(1000) для больших данных. 🟢Используйте computeIfAbsent() – сокращает проверку наличия ключа перед вставкой. 🟢Не используйте synchronized HashMap – вместо этого применяйте ConcurrentHashMap. ✔️ Пример:
Map<String, Integer> map = new HashMap<>(1000);
map.computeIfAbsent("key", k -> 42);
💡 Совет: Настраивайте HashMap под свои задачи, особенно если храните большие объёмы данных. #java #hashmap #performance

⌨️ Java | Tests - проверь свои знания в Java! Только тесты, ничего лишнего! Присоединяйся! 😉 👉 @java_tsts
⌨️ Java | Tests - проверь свои знания в Java! Только тесты, ничего лишнего! Присоединяйся! 😉 👉 @java_tsts

☕️ Apache PDFBox 🌐Apache PDFBox - это мощная библиотека с открытым исходным кодом для работы с PDF-документами в Java. Она позволяет создавать новые PDF-файлы, манипулировать существующими и извлекать содержимое из PDF-документов. 👁 Пример: Создание PDF с таблицей и изображением

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.IOException;

public class PDFCreationExample {
    public static void main(String[] args) throws IOException {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage();
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                // Добавляем заголовок
                contentStream.beginText();
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, 16);
                contentStream.newLineAtOffset(50, 750);
                contentStream.showText("Отчет о продажах");
                contentStream.endText();

                // Добавляем таблицу
                drawTable(contentStream, 50, 700, new String[][] {
                    {"Продукт", "Количество", "Цена"},
                    {"Яблоки", "100", "50"},
                    {"Бананы", "150", "40"},
                    {"Апельсины", "75", "60"}
                });

                // Добавляем изображение
                PDImageXObject image = PDImageXObject.createFromFile("path/to/image.jpg", document);
                contentStream.drawImage(image, 50, 500, 200, 150);
            }

            document.save("Отчет_о_продажах.pdf");
        }
    }

    private static void drawTable(PDPageContentStream contentStream, float x, float y, String[][] content) throws IOException {
        // Метод для рисования таблицы (код опущен для краткости)
    }
}
🛠Apache PDFBox предоставляет разработчикам гибкие инструменты для работы с PDF. Это делает его идеальным выбором для приложений, требующих создания отчетов, обработки форм или извлечения данных из PDF-документов.

Битрикс24 💻Один онлайн-сервис для совместной работы. 📱10+ инструментов. ✅0 денег. Счастливые сотрудники. Прибыльный бизнес.
Битрикс24 💻Один онлайн-сервис для совместной работы. 📱10+ инструментов. ✅0 денег. Счастливые сотрудники. Прибыльный бизнес. Регистрируйтесь и забирайте себе Зарегистрироваться #реклама 16+ office-online.bitrix24.ru О рекламодателе

⌨️ Сравнение ArrayList vs LinkedList Оба класса реализуют List, но имеют разные внутренние структуры и производительность. Ar
⌨️ Сравнение ArrayList vs LinkedList Оба класса реализуют List, но имеют разные внутренние структуры и производительность. ArrayList использует динамический массив, а LinkedList использует двусвязный список. 🤔 Что выбрать? ✔️ Используйте ArrayList, если важен быстрый доступ по индексу и добавление в конец. ✔️ Используйте LinkedList, если часто удаляете/вставляете элементы в середину. 📌 ArrayList чаще предпочтительнее, так как LinkedList требует больше памяти и редко даёт преимущества. 🚀

🖥 Наконец-то нормальный канал по Python! PytStart – для каждого питониста! 🔸 Полезные статьи 🔸 Лайфхаки и советы 🔸 Разбор
🖥 Наконец-то нормальный канал по Python! PytStart – для каждого питониста! 🔸 Полезные статьи 🔸 Лайфхаки и советы 🔸 Разбор кода и практические задания Присоединяйся и начни свой путь в Python уже сегодня: @pytstart