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

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

الذهاب إلى القناة على Telegram

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

إظهار المزيد
6 811
المشتركون
-624 ساعات
-137 أيام
-6930 أيام
أرشيف المشاركات
⚡️ 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

⌨️ Array vs ArrayList Выбор между Array и ArrayList зависит от специфики задачи, которую требуется решить. 📌Помните о следующих особенностях этих типов: ✔️ Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayLists может динамически изменяться. ✔️ Массивы работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы. ✔️ При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException. ✔️ У ArrayList только одно измерение, а вот массивы могут быть многомерными.

import java.util.ArrayList;

public class arrayVsArrayList {

  public static void main(String[] args) {

    // объявление Array
    int[] myArray = new int[6];

    // обращение к несуществующему индексу
    myArray[7]= 10; // ArrayIndexOutOfBoundsException

    // объявление ArrayList
    ArrayList<Integer> myArrayList = new ArrayList<>();

    // простое добавление и удаление элементов
    myArrayList.add(1);
    myArrayList.add(2);
    myArrayList.add(3);
    myArrayList.add(4);
    myArrayList.add(5);
    myArrayList.remove(0);

    // получение элементов ArrayList    
    for(int i = 0; i < myArrayList.size(); i++) {
      System.out.println("Element: " + myArrayList.get(i));
    }
  
    // многомерный Array
    int[][][] multiArray = new int [3][3][3]; 
    }
}

⌨️ Перегрузка (Overloading) vs. Переопределение (Overriding) Перегрузка методов (Method Overloading) – это создание нескольки
⌨️ Перегрузка (Overloading) vs. Переопределение (Overriding) Перегрузка методов (Method Overloading) – это создание нескольких методов с одним именем, но разными параметрами (различаются количество или типы аргументов). Пример:

class MathUtils {
    int sum(int a, int b) {
        return a + b;
    }
    
    double sum(double a, double b) { // Перегруженный метод
        return a + b;
    }
}
Переопределение методов (Method Overriding) – это изменение поведения унаследованного метода в подклассе. Пример:

class Animal {
    void sound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() { // Переопределение метода
        System.out.println("Bark");
    }
}
Вывод: ✔️Перегрузка – это создание нескольких версий метода в одном классе. ✔️Переопределение – это изменение поведения метода родителя в подклассе.

⌨️ Double-brace инициализация - техника создания и инициализации коллекций в одном выражении, используя анонимный внутренний класс. ✅ Пример:

List<String > planets = new ArrayList<>() {{
    add ("Mercury");
    add ("Venus");
    add ("Earth");
    add ("Mars");
    add ("Jupiter");
    add ("Saturn");
    add ("Uranus") ;
    add ("Neptune");
}};
Преимущества: 1. Краткость 2. Читаемость 3. Удобство для небольших коллекций 🚫Недостатки: 1. Создание анонимного класса (увеличение потребления памяти) 2. Скрытая ссылка (возможные утечки памяти) 3. Ограничения с final классами 4. Несовместимость с оператором diamond 5. Потенциальное влияние на производительность 6. Считается антипаттерном 🔻Альтернативы: 1. ☕️Java 8 Stream API:

List<String> planets = Stream.of("Mercury", "Venus", "Earth")
                             .collect(Collectors.toList());
2. ☕️Java 9+:
List<String> planets = List.of("Mercury", "Venus", "Earth");
3.🖨Конструктор копирования:

List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Несмотря на удобство, double-brace инициализация считается антипаттерном из-за проблем с производительностью и возможных утечек памяти.