ru
Feedback
Easy Java

Easy Java

Открыть в Telegram

Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy

Больше
5 042
Подписчики
+124 часа
-167 дней
-7530 день
Архив постов
ИИ уже умеет написать тысячи строк кода за вечер. Вопрос теперь не в том, умеете ли вы пользоваться нейросетью, а понимаете л
ИИ уже умеет написать тысячи строк кода за вечер. Вопрос теперь не в том, умеете ли вы пользоваться нейросетью, а понимаете ли вы, что именно она делает с вашим проектом. «ИИнтеллигенция» - канал для тех, кто хочет разбираться в ИИ глубже обычного пользователя. Здесь выходят: — полезные open-source-инструменты с исходниками; — разборы ИИ-агентов и автоматизации разработки; — локальные модели и self-hosted-сервисы; — реальные инциденты, уязвимости и проблемы AI-кода. Из поста понятно не только что вышло, но и зачем это вам, как запустить и где искать подвох. Читайте «ИИнтеллигенцию» → @clucai

👩‍💻 Что такое Collectors.partitioningBy() и зачем он нужен? Collectors.partitioningBy() — это коллектор из Java Stream API, который разделяет элементы потока на две группы (true/false) на основе заданного предиката, возвращая Map<Boolean, List<T>>. ⚡️ Пример:
import java.util.*;
import java.util.stream.*;
import java.util.function.Predicate;

public class PartitioningByExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        // Разделение чисел на четные и нечетные
        Map<Boolean, List<Integer>> partitioned = numbers.stream()
            .collect(Collectors.partitioningBy(n -> n % 2 == 0));
        
        System.out.println("Четные: " + partitioned.get(true));    // [2, 4, 6, 8, 10]
        System.out.println("Нечетные: " + partitioned.get(false)); // [1, 3, 5, 7, 9]
        
        // Строки по длине
        List<String> words = Arrays.asList("яблоко", "груша", "слива", "апельсин", "лимон");
        
        Map<Boolean, List<String>> byLength = words.stream()
            .collect(Collectors.partitioningBy(word -> word.length() > 5));
        
        System.out.println("\nКороткие слова (≤5 букв): " + byLength.get(false));
        System.out.println("Длинные слова (>5 букв): " + byLength.get(true));
        
        // С дополнительным коллектором - подсчет количества
        Map<Boolean, Long> countPartition = numbers.stream()
            .collect(Collectors.partitioningBy(
                n -> n > 5,
                Collectors.counting()
            ));
        
        System.out.println("\nЧисел ≤5: " + countPartition.get(false));
        System.out.println("Чисел >5: " + countPartition.get(true));
    }
}
👀 Особенно полезен для разделения данных на прошедшие/не прошедшие валидацию, категоризации на успешные/ошибочные операции, статистического анализа.
➡️ Easy Java | #Теория

ㅤ Страх. Гнев. Стыд. Вина. Тревога. Апатия. Уныние. Изоляция. Бессилие. Контакт. Тепло. Чувство. Живость. Ясность. Точность.
Страх. Гнев. Стыд. Вина. Тревога. Апатия. Уныние. Изоляция. Бессилие. Контакт. Тепло. Чувство. Живость. Ясность. Точность. Присутствие. Тишина. Покой. Если выбор сделан, твоё место здесь: мэверик Входи осторожно. Кислород зашкаливает. ㅤ

👩‍💻 Что такое ReentrantReadWriteLock в Java и зачем он нужен? ReentrantReadWriteLock — это улучшенная альтернатива synchronized, позволяющая одновременно выполнять несколько чтений, но блокировать доступ на запись.
Он состоит из двух независимых замков: • readLock() — совместимый, позволяет многим потокам читать параллельно • writeLock() — эксклюзивный, разрешает только одному потоку писать
⚡️ Пример:
import java.util.concurrent.locks.*;

public class Main {
    private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private static int value = 0;

    public static void main(String[] args) {
        Runnable reader = () -> {
            lock.readLock().lock();
            try {
                System.out.println("Чтение: " + value);
            } finally {
                lock.readLock().unlock();
            }
        };

        Runnable writer = () -> {
            lock.writeLock().lock();
            try {
                value++;
                System.out.println("Запись: " + value);
            } finally {
                lock.writeLock().unlock();
            }
        };

        new Thread(reader).start();
        new Thread(writer).start();
    }
}
👀 ReentrantReadWriteLock особенно полезен, когда чтений гораздо больше, чем записей — например, в кэшах, справочниках или аналитических сервисах
➡️ Easy Java | #Теория

Что выведет код?
Anonymous voting

👩‍💻 Викторина: что выведет код? class Parent { static int a = initA(); static int initA() { System.out.print("P "); return 1; } Parent() { System.out.print("p "); } } class Child extends Parent { static int b = initB(); static int initB() { System.out.print("C "); return 2; } Child() { System.out.print("c "); } } public class Main { public static void main(String[] args) { new Child(); } } ➡️ Easy Java | #Викторина

👩‍💻 A2A Java SDK 1.0.0: стабильный релиз для агентных приложений на Java Официальный Java SDK для протокола Agent2Agent дос
👩‍💻 A2A Java SDK 1.0.0: стабильный релиз для агентных приложений на Java Официальный Java SDK для протокола Agent2Agent достиг версии 1.0.0. Теперь Java-разработчики могут строить агентные приложения, которые взаимодействуют с агентами на других языках и фреймворках. Agent2Agent — это протокол, управляемый Linux Foundation (изначально представленный Google), который позволяет агентам на разных фреймворках и языках находить друг друга, делегировать задачи и обмениваться результатами. ⛓ Подробнее в статье ➡️ Easy Java | #Статья

Совет на 2027 год — перекатывайтесь в системную аналитику. Системные аналитики остаются одними из самых дефицитных специалистов в IT. Они проектируют интеграции, работают с API и требованиями, а зарплаты мидлов начинаются от 200 000 ₽. А чтобы освоить профессию всего за 3 месяца и получить первый оффер — изучите канал Насти Глазовой. Её бэкграунд: 5 лет в IT, путь от джуна до лида аналитики, опыт работы в Wildberries, Самокате и Ralf Ringer, а также более 150 выпускников со средней зарплатой от 177 000 ₽. На канале вы найдёте: — Всё, что нужно системному аналитику: UML, BPMN, SQL, REST API, интеграции и работа с требованиями. — Советы по резюме, которые помогают выделяться среди сотен кандидатов. — Практические материалы по трудоустройству: от подготовки к интервью до выхода на первый оффер. Помимо обучения, Настя помогает подготовить сильное резюме, пройти пробные собеседования с HR и получить рекомендации в компании-партнёры. Переходи в закрепленное сообщение в канале: @nastyacareera

Ну, а как по другому… ➡️ Easy Java | #мем
Ну, а как по другому… ➡️ Easy Java | #мем

🤖 Как создать B2B CRM с ИИ на Джеймикс и не потерять контроль над разработкой? ➡️ 2023 — попробуй ChatGPT ➡️ 2024 — генериру
🤖 Как создать B2B CRM с ИИ на Джеймикс и не потерять контроль над разработкой? ➡️ 2023 — попробуй ChatGPT ➡️ 2024 — генерируй код ➡️ 2025 — используй агентов ➡️ 2026 — пора разобраться, как встроить ИИ в управляемый процесс разработки 16 июня в 16:00 МСК — практический воркшоп от Джеймикс (Java-платформа с ИИ для разработки корпоративных систем), Kodacode и OpenIDE. Покажем, как пройти путь от постановки задачи до рабочего контура корпоративной CRM. Не в теории — в коде. Что разберём: 🔹 как сформировать спецификацию для разработки с ИИ 🔹 как удержать агента в рамках проекта 🔹 как создать модель данных, экраны и бизнес-логику 🔹 типичные ошибки агентного режима и как их исправлять 🔹 чем управляемая ИИ-разработка отличается от вайб-кодинга Заберёте с собой:готовый код open-source B2B CRM на Java со встроенным ИИ-ассистентом — можно сразу брать за основу в своих проектах. 👉 Регистрируйтесь #реклама О рекламодателе

👩‍💻 Что такое ThreadLocal.withInitial() и зачем он нужен? Это статический метод для создания ThreadLocal переменной с фабрикой начального значения. Каждый поток получает свою собственную копию объекта, а withInitial задаёт ленивый способ её создания — при первом вызове get(). ⚡️ Пример:
import java.text.SimpleDateFormat;
import java.util.concurrent.*;

public class ThreadLocalExample {
    // Безопасный форматтер без синхронизации
    private static final ThreadLocal<SimpleDateFormat> dateFormat =
        ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

    public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            pool.submit(() -> {
                String formatted = dateFormat.get().format(new java.util.Date());
                System.out.println(Thread.currentThread().getName() + " -> " + formatted + " (task " + taskId + ")");
            });
        }

        pool.shutdown();
    }
}
Особенно полезен при хранении не потокобезопасных объектов (SimpleDateFormat, Random), изоляции пользовательской сессии/токена в вебе, переиспользовании тяжелых ресурсов без синхронизации.
➡️ Easy Java | #Теория

👩‍💻 Викторина: что выведет код? class Parent { static String show() { return "Parent"; } String print() { return show(); } } class Child extends Parent { static String show() { return "Child"; } } public class Main { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.print()); } } ➡️ Easy Java | #Викторина

⚡️ Писать код руками больше не нужно! Привет. Меня зовут Кирилл. Я создаю топовые подборки с уроками по AI и вайбкодингу: — 6
⚡️ Писать код руками больше не нужно! Привет. Меня зовут Кирилл. Я создаю топовые подборки с уроками по AI и вайбкодингу: — 60+ промптов для дебага: поиск ошибок, оптимизация кода — 40 бесплатных курсов по вайбкодингу — 150 гайдов, как использовать ChatGPT, Claude Code, Antigravity, Cursor, Perplexity, Lovable — 100 готовых модулей: авторизация, админки, логирование, тесты, i18n — 37 MCP серверов: дизайн, разработка, Тесты/QA, деплой Всего 10 минут в день на канале и ты научишься вайб-кодить проекты любой сложности. Материалы в закрепе, постоянно пополняются👆🏻

👩‍💻 Качество кода в эпоху AI: как не утонуть в багах и уязвимостях Автор разбирает, почему внедрение AI может снижать проду
👩‍💻 Качество кода в эпоху AI: как не утонуть в багах и уязвимостях Автор разбирает, почему внедрение AI может снижать продуктивность, раздувать время ревью и плодить уязвимости. И главное — как это лечить не магическими промптами, а инженерным пайплайном: SDD, TDD, узкие AI-ревьюеры, property-based testing и связка LLM с формальными анализаторами. ⛓ Читаем статью по ссылке ➡️ Easy Java | #Статья

Не тимлид, а тимлидище ➡️ Easy Java | #Мем
Не тимлид, а тимлидище ➡️ Easy Java | #Мем

В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них ран
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда? Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России 📆 в канале размещаются как онлайн, так и оффлайн мероприятия; 👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие; 🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах: 🚀 IT-мероприятия России подписывайся и будь в курсе всех предстоящих мероприятий!

👩‍💻 Что такое Phaser в Java и зачем он нужен? Phaser — это продвинутый синхронизатор из java.util.concurrent, который позволяет потокам координироваться по фазам выполнения.
В отличие от CountDownLatch и CyclicBarrier, он гибче: количество участников можно динамически добавлять и убирать.
• Поддерживает несколько фаз • Гибко управляет количеством потоков • Удобен для пошаговых алгоритмов ⚡️ Пример:
import java.util.concurrent.Phaser;

public class Main {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);

        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " — фаза 1");
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName() + " — фаза 2");
        };

        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
    }
}
👀 Phaser особенно полезен для задач с несколькими этапами синхронизации — например, симуляций, параллельных вычислений или координации батчевых операций
➡️ Easy Java | #Теория