bookjava | Unsorted

Telegram-канал bookjava - Библиотека Java разработчика

10986

📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

Subscribe to a channel

Библиотека Java разработчика

🧠 @Value vs @ConfigurationProperties — кого выбрать?

Часто вижу, как даже опытные разработчики по привычке используют @Value для инъекции конфигурации:


@Value("${app.timeout}")
private Duration timeout;


⚠️ Но с ростом приложения @Value становится хрупким и неудобным.

📌 Лучший подход — использовать @ConfigurationProperties:


@ConfigurationProperties(prefix = "app")
public record AppProperties(Duration timeout, String apiKey) {}



@Bean
@ConfigurationPropertiesBinding
public AppProperties appProperties() {
return new AppProperties();
}


✅ Преимущества @ConfigurationProperties:
- 💡 Группирует настройки логически
- 🔍 Работает с валидацией (@Validated, @NotNull, и т.д.)
- 📚 Отлично поддерживается IDE (автокомплит, рефакторинг)
- 🔧 Удобно тестировать и мокать

🆕 Начиная с Spring Boot 2.2+, можно использовать record-классы и просто зарегистрировать бин через @EnableConfigurationProperties:


@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {}


💬 Так что, если у вас в проекте до сих пор десятки @Value — самое время навести порядок.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🧠 @Value в Spring — это ловушка, если вы используете списки или map'ы

Многие знают, что можно заинжектить список строк из application.yml вот так:


app:
langs:
- en
- fr
- de



@Value("${app.langs}")
private List<String> langs;


Но знаете, что вы получите?

⚠️ ОШИБКУ. @Value не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de) — всё не так очевидно: Spring не применяет ConversionService для списков.

📌 Решение — использовать @ConfigurationProperties:


app:
langs:
- en
- fr
- de



@ConfigurationProperties(prefix = "app")
@Component
public class AppProps {
private List<String> langs;
// геттеры/сеттеры
}


💡 Профит:
- работает с List, Map, вложенными объектами;
- валидация через @Validated и @NotEmpty;
- легко покрыть тестами;
- меньше магии.

⚠️ @Value хорош для простых скаляров. Всё остальное — через @ConfigurationProperties.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨‍💻📲

Папка с каналами для DevOps, Linux - Windows СисАдминов 👍

Папка с каналами для 1С программистов 🧑‍💻

Папка с каналами для C++ программистов 👩‍💻

Папка с каналами для Python программистов 👩‍💻

Папка с каналами для Java программистов 🖥

Папка с книгами для программистов 📚

Папка для программистов (frontend, backend, iOS, Android) 💻


GitHub Сообщество 🧑‍💻
/channel/Githublib Интересное из GitHub

Базы данных (Data Base) 🖥
/channel/database_info Все про базы данных


Разработка игр 📱
/channel/game_devv Все о разработке игр

БигДата, машинное обучение 🖥
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning


QA, тестирование 🖥
/channel/testlab_qa Библиотека тестировщика

Шутки программистов 📌
/channel/itumor Шутки программистов

Защита, взлом, безопасность 💻
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free

Книги, статьи для дизайнеров 🎨
/channel/ux_web Статьи, книги для дизайнеров

Математика 🧮
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак🙃
/channel/Excel_lifehack

Технологии 🖥
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)

Вакансии 💰
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
/channel/rabota1C_rus Вакансии для программистов 1С

Читать полностью…

Библиотека Java разработчика

🦾 Тест по Java 🦾

📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!

👩‍💻 В программе курса — все актуальные инструменты, необходимые Middle+ разработчику на Java. Возможна рассрочка.

🎁 Начните обучение со скидкой, подробности у менеджеров. ПРОМОКОД: JAVA_04

⏰ Время прохождения теста ограничено 30 минут

👉ПРОЙТИ ТЕСТ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

🎯 Как Java находит классы? Под капотом ClassLoader'ов

Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов.

Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков:

1. Bootstrap ClassLoader
Самый базовый. Загружает классы из JDK (rt.jar, java.base, и так далее). На него даже нельзя получить ссылку в коде.

2. Platform ClassLoader (ранее Extension)
Загружает модули платформы (jmods), доступные из JDK, но не из java.base.

3. Application ClassLoader
Твой лучший друг. Он отвечает за загрузку классов из classpath (например, target/classes и lib/*.jar).

Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например:


ClassLoader customLoader = new URLClassLoader(new URL[]{new File("plugins/").toURI().toURL()});
Class<?> pluginClass = customLoader.loadClass("com.example.PluginImpl");


💡 Это используется в плагинных системах (например, IntelliJ, Jenkins, Minecraft).
Но будь осторожен — неправильная работа с загрузчиками может привести к ClassCastException, даже если классы выглядят одинаково.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Понимание разницы между Error и Exception в Java ✅

Что такое Error в Java?
- Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека.

Что такое Exception в Java?
- Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции try-catch.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

💻Хотите быстро научиться строить интерактивные интерфейсы на C#?

Присоединяйтесь к открытому уроку 8 апреля в 20:00 мск, где мы покажем, как сделать ваш код живым и динамичным!

📖Вы научитесь использовать класс System.Console для создания простых, но интересных программ с текстовыми интерфейсами. Например, вы напишете свою версию игры "Крестики-нолики" прямо в консоли. Это легко и увлекательно!

🔥С этим знанием вы сможете не просто выводить данные, а создавать интерактивные приложения, которые смогут реагировать на действия пользователя.

➡️ Зарегистрируйтесь на вебинар и получите скидку по промокоду SHARP_SPEC_4 на большое обучение «C# Developer»: https://vk.cc/cKzfGN

Промокод действителен до 30.04.2025

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

👨‍💻 Как уменьшить количество boilerplate-кода с помощью Lombok

Сегодня хочу показать вам один из любимых инструментов — Project Lombok. Он позволяет избавиться от тонны шаблонного кода, который мы ежедневно пишем в Java.

🔹 Вместо десятков строк с геттерами, сеттерами, equals/hashCode и конструкторами, ты просто добавляешь аннотации:


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
}


И всё! Lombok сам сгенерирует:

- геттеры/сеттеры
- конструкторы
- toString(), equals() и hashCode()

🔹 Часто забываешь про @Builder? Он тоже есть! И позволяет удобно создавать объекты:


User user = User.builder()
.name("Женя")
.age(30)
.build();


🧨 Важно: IDE не всегда сразу видит Lombok-код. Убедись, что у тебя установлен Lombok plugin в IntelliJ IDEA или Eclipse.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

👩‍💻 Сообщения, которые не теряются: Брокеры против хаоса в Java

Приглашаем на открытый урок.

🗓 08 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».

Узнайте, как обеспечить 100% доставку данных в распределенных Java-системах: боремся с потерями, хаосом и scaling-вызовами.

О чём поговорим:
✔️Брокеры vs хаос: Как Kafka, RabbitMQ и ActiveMQ спасают данные от потерь.
✔️ Асинхронный Java на практике: Пишем код с гарантированной доставкой сообщений.
✔️ Антипаттерны: Топ-5 ошибок, которые приводят к краху системы (и как их избежать).

Кому будет интересно:
Вебинар будет полезен разработчикам, архитекторам и специалистам по интеграции, работающим с распределенными системами и стремящимся обеспечить надежную доставку данных.

В результате урока:
Участники научатся выбирать брокеры под задачи, реализовывать паттерны вроде Publisher-Subscriber , а также получат шаблоны кода для интеграции в свои проекты.

🔗 Ссылка на регистрацию: https://vk.cc/cKqBkW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

💡Совет: @TransactionalEventListener — это специализированная версия @EventListener, которая прослушивает событие и ждёт завершения текущей транзакции, прежде чем сработать.
Ожидание согласованного состояния базы данных позволяет безопаснее реагировать на изменения, внесённые в БД ✨

#Java #springboot

👉@BookJava

Читать полностью…

Библиотека Java разработчика

💡 Collection vs List в Java: в чём разница и когда что использовать

Сегодня разберёмся с одним из самых популярных вопросов у джавистов: чем отличается Collection от List и когда что применять.


🔹 Collection — это базовый интерфейс всех коллекций в Java. Он описывает общие операции:
add(), remove(), size(), contains() и т.д.

🔹 List — это подинтерфейс Collection, предназначенный для работы с упорядоченными списками.
Дополнительно даёт методы:
get(index), set(index, value), indexOf(), add(index, value).


🔧 Пример с Collection:


Collection<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");

for (String name : names) {
System.out.println(name);
}


Здесь важно только наличие элементов — порядок и индексы не важны.


🔧 Пример с List:

List<String> cities = new ArrayList<>();
cities.add("Moscow");
cities.add("Berlin");
cities.add(1, "Paris");

System.out.println(cities.get(1)); // Paris


В этом случае нужен порядок и доступ по индексу — значит, выбираем List.


📌 Когда использовать что:

- Используй Collection, если хочешь абстрагироваться от конкретной структуры и не используешь индексы.
- Используй List, если:
- важен порядок добавления,
- нужен доступ по индексу,
- требуется вставка в определённое место.

🧠 Совет:
При проектировании методов или API лучше принимать Collection — так ты не ограничиваешь пользователя в реализации.
А если внутри метода тебе нужны индексы — переходи на List.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🧵 Как правильно логировать ошибки в Java-приложении

Привет, друзья! Сегодня я расскажу о простой, но критически важной теме — логирование ошибок. Часто вижу, как разработчики либо совсем не логируют исключения, либо делают это неправильно. В итоге: баг есть, а откуда он взялся — непонятно.

Вот пара реальных примеров:

Плохо:


try {
doSomething();
} catch (Exception e) {
System.out.println("Error happened");
}


Хорошо:

private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

try {
doSomething();
} catch (Exception e) {
logger.error("Failed to do something", e);
}


💡 Почему это важно:
- logger.error позволяет видеть стек исключения, а это ключ к диагностике.
- Можно использовать logger.warn или logger.info в зависимости от уровня важности.
- Хороший лог помогает быстро локализовать проблему на проде без дебага.

🎯 Совет:
Используйте Slf4j в связке с Logback или Log4j2. И обязательно следите за форматом логов — например, логируйте traceId, userId, requestId и другие полезные метаданные.

А вы как логируете ошибки у себя в проекте? Делаете свою обёртку? Используете AOP?

👇 Делитесь в комментариях!

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Docker и Spring Boot микросервис (Быстрый старт)

Разберем основные понятия докера и запустим spring boot микросервис в докере

00:00 Intro
00:58 Установить докер
02:05 Развитие виртуализации
09:30 Компоненты Docker
11:25 Docker Daemon
11:50 Dockerfile
12:42 Docker Image
13:12 Docker Registry
13:45 Docker Container
14:00 Dockerhub
14:57 Практика. Пишем микросервис
17:30 Практика. Пишем dockerfile
23:25 Практика. Создаем docker образ
25:48 Практика. Запускам docke контейнер
27:19 Практика. Основные команды
30:00 Best practice. Как еще можно написать dockerfile
33:14 Best practice. Рекомендации
35:01 Итог

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

⚡️👩‍💻 Хотите освоить Java с нуля и стать востребованным разработчиком? Это один из самых популярных языков программирования, который используется в крупных компаниях по всему миру.

🦾 Курс «Специализация: Java-разработчик» — это три ступени обучения, которые помогут вам пройти путь от новичка до востребованного Middle-разработчика. Вы научитесь создавать серверные приложения, работать с базами данных, осваивать Spring, Docker, Kubernetes и многое другое.

Обучение ведут практикующие эксперты, программа адаптирована для новичков, а диплом OTUS котируется в ведущих IT-компаниях.

Наш партнер — СберКорус, разработчик передовых цифровых решений!

Осталось всего несколько дней, чтобы записаться на курс и получить скидку.

👉 Успейте оставить заявку прямо сейчас: https://vk.cc/cKaEMl

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

Хранилище файлов. Java + WebDav

Java + WebDav - загружаем файл на webdav через Rest запрос.

00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🛡Хотите строить защищенные и масштабируемые микросервисы с помощью ASP.NET Core?

Присоединяйтесь к открытому уроку 17 апреля в 20:00 МСК и узнайте, как создать безопасные микросервисы с использованием JWT, OpenID Connect, и .NET Aspire. Мы разберем, как защитить API, оптимизировать производительность и внедрить современные подходы к аутентификации и авторизации.

❗️Что разберем:
- Принципы и преимущества архитектуры микросервисов.
- Защиту API с использованием JWT и OpenID Connect.
- Инструменты .NET Aspire для оркестрации сервисов и настройки окружения.
- Реальные шаги по созданию микросервисов, настройке безопасности и работе с Docker.

🚀 Урок пройдет в преддверии старта курса «C# ASP.NET Core разработчик». 🎁 Все участники получат скидку на обучение по промокоду: ASP_NET_04.

Присоединяйтесь: https://vk.cc/cKOiH1

Промокод действителен до 28.04.2025

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Библиотека Java разработчика

🔍 Почему Optional — это не замена null везде и всегда

Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании Optional в Java.

Многие разработчики, особенно начинающие, начинают использовать Optional везде, где может быть null, думая, что это автоматически делает код "безопасным". Но так ли это?

📌 Ключевая идея Optionalсигнализировать о возможном отсутствии значения в результате вызова метода.
А не заменять все поля и параметры на Optional.

Примеры плохой практики:


public class User {
private Optional<String> name; // ❌ Не нужно так делать
}


Почему это плохо:

- Увеличивается сложность сериализации (особенно с Jackson, GSON).
- Не соответствует архитектурной задумке: Optional — это не контейнер для полей.
- Проблемы с JPA (Hibernate не дружит с Optional-полями).
- Понижается читаемость кода.

💡 Лучше использовать Optional вот так:


public Optional<User> findUserById(Long id) {
// Возвращаем Optional, потому что пользователь может не существовать
}


То есть Optional — это про контракт на метод, а не про хранение данных.

Если кратко:
- ✅ Используй Optional в сигнатурах методов, когда результат может отсутствовать.
- ❌ Не используй Optional в полях и параметрах конструктора.

А ты как используешь Optional в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🧠 Как Java хранит boolean в памяти?

Сегодня я покажу вам, почему boolean в Java — это не просто true или false. А за этим простым типом скрывается интересный нюанс, особенно если ты задумываешься об экономии памяти.

В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что boolean — это один бит (true/false), на самом деле в памяти он занимает 1 байт (а иногда и больше, в зависимости от структуры объекта).

Пример:


public class Flags {
boolean flag1;
boolean flag2;
boolean flag3;
}

Ты думаешь — три бита. Но JVM выравнивает поля, и из-за этого объект может занимать 16 байт или больше, в зависимости от архитектуры. Почему так?

📌 Причина:
JVM упрощает модель памяти ради производительности — доступ к байтам быстрее, чем к битам. Нет битовых сдвигов, масок и лишней логики.

💡 Что делать, если хочется сэкономить память?

Используй BitSet:

BitSet flags = new BitSet(3);
flags.set(0, true);


Это уже реальная битовая структура. Отличный выбор, если у тебя десятки или сотни логических флагов.

А ты знал об этом нюансе хранения boolean? Пиши в комментариях, сталкивался ли с перерасходом памяти из-за простых типов.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🔍 Как дебажить ClassLoader-проблемы в Java

В прошлом посте я рассказывал, как работает механизм загрузки классов в JVM. Сегодня разберём, как дебажить проблемы, которые возникают из-за загрузчиков. А это, между прочим, один из самых частых источников боли в больших проектах.

🧨 Типичная проблема:


ClassCastException: class com.example.MyClass cannot be cast to class com.example.MyClass

Текст ошибки одинаковый класс... но JVM считает их разными. Почему?

👉 У каждого Class в JVM есть два признака уникальности:
1. Полное имя (com.example.MyClass)
2. Загрузчик (ClassLoader)

Если один и тот же класс загружен разными загрузчиками, JVM считает, что это разные классы. Отсюда и ошибки.

🛠 Как дебажить:
1. Вывести загрузчик:

System.out.println(myObject.getClass().getClassLoader());


2. Сравнить загрузчики:
Убедись, что два экземпляра класса загружены одним и тем же ClassLoader.

3. JVM-флаги:
Добавь при запуске:

-verbose:class

Это покажет, откуда и каким загрузчиком загружался каждый класс.

4. Используй инструменты:
- jvisualvm (вкладка "Class Loader")
- jconsole
- плагин для IntelliJ: "Classloader Leak Prevention"


📌 А что такое child-first загрузчики?

По умолчанию Java использует parent-first стратегию: сначала спрашивает родителя, и только потом загружает сама. Но иногда нужно наоборот — особенно в системах с плагинами, чтобы изолировать версии зависимостей.

👉@BookJava

Читать полностью…

Библиотека Java разработчика

❓ Java-разработчики, уже пробовали работать с асинхронным кодом через Scala Future?

⏰ 15 апреля в 18:30 на открытом вебинаре Валентин Шилин расскажет, как эффективно использовать Future в Scala: избегать ошибок (блокировки, потеря контекста), комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions) и улучшать производительность кода.

Валентин — старший программист и аналитик данных Deutsche Telekom IT GmbH, эксперт в обработке больших данных и преподаватель курсов по Scala и Apache Spark.

Если вы используете Java и хотите перейти на Scala, или уже работаете с Play Framework, Akka или Spark, — вебинар точно для вас. Научитесь грамотно писать асинхронный код, избегая типичных проблем.

🎁 Все участники смогут задать вопросы эксперту и получат скидку на полный курс по Scala-разработке.

👉 Регистрируйтесь и повысьте эффективность своей работы

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Библиотека Java разработчика

🧩 Nullable поля в Entity: угроза вашему приложению

Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование nullable = true в JPA-сущностях по умолчанию, без осознанного выбора.

Когда мы пишем:


@Column(name = "middle_name")
private String middleName;


JPA считает, что поле nullable, даже если по бизнес-логике оно быть пустым не должно. А вот что будет, если вы забыли это уточнить:

1. На уровне БД поле будет NULLABLE.
2. Hibernate не подскажет, что вы забыли заполнить поле.
3. В будущем это приведёт к NPE, особенно при маппинге DTO → Entity.
4. При миграциях Flyway/ Liquibase — возможно несоответствие схемы и модели.

🔍 Что делать?
1. Явно указывать nullable = false, если поле обязано быть заполнено:

@Column(name = "email", nullable = false)
private String email;

2. Использовать Bean Validation (@NotNull) — и не забывать включить её в контроллерах, сервисах, Hibernate.
3. Проверяйте соответствие схемы и сущностей. Можно использовать плагин Hibernate5DDL или включать валидацию схемы при старте.

📌 Простой совет: по умолчанию всё @Column(nullable = false), пока не докажете обратное.

Берегите свои сущности 😉

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🧹 Как не захламлять логи в Java

Сегодня покажу вам простой, но важный приём: логируйте по уровню, а не по привычке.

Многие делают так:


log.info("User found: " + user);


Кажется безобидным? А теперь представьте, что в user лежит целый граф сущностей с ленивыми загрузками, или список из тысячи записей. Вы просто убьёте читаемость логов и производительность.

Вот что делать вместо:


if (log.isDebugEnabled()) {
log.debug("User found: {}", user);
}


А ещё лучше — логируйте только то, что действительно нужно:


log.debug("User found: id={}, email={}", user.getId(), user.getEmail());


Так вы:
- Уменьшите размер логов
- Сохраните ценную информацию
- Упростите разбор инцидентов в проде

📌 Советы:
- INFO — для бизнес-событий (например, “заказ оформлен”)
- DEBUG — для отладки
- WARN и ERROR — для проблем, которые требуют внимания

А ты проверял свои логи в проде? Не пора ли провести ревизию?


👉@BookJava

Читать полностью…

Библиотека Java разработчика

🧪 Зачем Java-разработчику тестировать логику в SQL?

Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.

Если у тебя в проекте сложная логика в JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию.

🔹 Создаём функцию в PostgreSQL:


CREATE OR REPLACE FUNCTION test_discount(user_id INT)
RETURNS NUMERIC AS $$
BEGIN
RETURN (
SELECT
CASE
WHEN u.vip = true THEN 0.2
ELSE 0.05
END
FROM users u WHERE u.id = user_id
);
END;
$$ LANGUAGE plpgsql;


🔹 Проверяем прямо в базе:

SELECT test_discount(101); -- вернёт 0.2 или 0.05


✅ Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через pgTAP, например);
- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.

💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.

Попробуй — экономит массу времени на ревью и отладке запросов!

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Сегодня я покажу вам простой, но мощный приём, который помогает упростить работу с коллекциями в Java — Collectors.collectingAndThen.

Если вы когда-нибудь писали что-то вроде:


List<String> list = someStream
.collect(Collectors.toList());
return Collections.unmodifiableList(list);


то collectingAndThen сделает это в одну строку:


List<String> list = someStream.collect(
Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
)
);


Где это может пригодиться?

– Возвращаете коллекцию из метода и не хотите, чтобы кто-то её изменял
– Хотите обернуть результат в Optional, Set, Map, EnumMap и т.д.
– Нужно после сбора в Stream ещё что-то сделать над результатом (например, отсортировать, фильтровать, обернуть)

Ещё пример:


Optional<String> maxName = people.stream()
.map(Person::getName)
.collect(Collectors.collectingAndThen(
Collectors.maxBy(Comparator.naturalOrder()),
Optional::ofNullable
));


Этот метод часто остаётся в тени, но он может существенно упростить код и сделать его чище. Попробуйте использовать его в своём проекте 😉

👉@BookJava

Читать полностью…

Библиотека Java разработчика

Подборка Telegram каналов для программистов

/channel/bash_srv Bash Советы
/channel/win_sysadmin Системный Администратор Windows
/channel/lifeproger Жизнь программиста. Авторский канал.
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/rabota1C_rus Вакансии для программистов 1С

Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин

/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux

1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
/channel/DevLab1C 1С:Предприятие 8

Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus

Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах

GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
/channel/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
/channel/game_devv Все о разработке игр

Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов

БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика

Шутки программистов 📌
/channel/itumor Шутки программистов

Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров

Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
/channel/Excel_lifehack

/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)

Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT

Читать полностью…

Библиотека Java разработчика

🦾 Тест по Java 🦾

📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!

👩‍💻 В программе курса — все актуальные инструменты, необходимые Middle+ разработчику на Java. Возможна рассрочка.

⏰ Время прохождения теста ограничено 30 минут

👉ПРОЙТИ ТЕСТ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

📕 Открытый урок по разработке веб-приложений на Scala

На открытом уроке 1 апреля в 20:00 мск мы погрузимся в мир бэкенд-разработки на Scala.

📗 В результате вы:

— Узнаете ключевые аспекты создания современных веб-приложений на Scala;
— Познакомитесь с популярными фреймворками и инструментами для работы с базами данных;
— На практике создадите простое CRUD-приложение для закрепления навыков.

Спикер: Алексей Воронец — руководитель разработки департамента проектных решений и поисковых систем в компании Naumen, эксперт с 14-летним опытом, специализирующийся на Scala и функциональном программировании.

👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие

https://vk.cc/cKbqwh

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…

Библиотека Java разработчика

Пишем рекомендательную систему музыки на Java
Андрей Кузнецов — Мастер-класс

Машинное обучение обычно рассматривают как отдельно стоящую область, требующую специфических знаний. Однако на практике бывает, что для решения бизнес-задач может быть достаточно и простых решений, имплементация которых не представляет сложностей для разработчика.

Используя открытый датасет, мы пишем с нуля на Java рекомендательную систему музыки и разберем, какие из наивных решений могут не сработать в реальных системах. На примере технологий Одноклассников спикер рассказывает, как решаются ML-задачи в гетерогенных продакшенах, где необходимо использовать вместе Java и Python.

Мастер-класс будет интересен разработчикам, которым интересна тема машинного обучения, но они либо еще не погружались в нее, либо сделали самые первые шаги.

источник

👉@BookJava

Читать полностью…

Библиотека Java разработчика

🔧 Как ускорить сборку Maven проекта в 3 раза

Сегодня покажу пару приёмов, которые помогут тебе значительно ускорить сборку Maven проекта. Особенно полезно, если ты работаешь с большими монолитами или частыми CI/CD прогонками.

🚀 1. Включи параллельную сборку

Добавь флаг -T (thread count), чтобы Maven собирал модули параллельно:


mvn clean install -T 1C


1C — это количество потоков = количеству ядер CPU. Можешь указать, например, -T 4 для 4 потоков. Эффект — сборка может стать в 2–4 раза быстрее.

🧹 2. Пропускай тесты, если они не нужны

Когда работаешь над UI, версткой или конфигурацией:


mvn clean install -DskipTests


⚠️ -DskipTests — пропускает *и* компиляцию тестов, и сами тесты.
Если хочешь только не запускать тесты, используй:


mvn clean install -Dmaven.test.skip=false -DskipTests=true


📦 3. Используй mvn dependency:go-offline

Это скачает все зависимости, плагины и сделает тебя независимым от интернета:


mvn dependency:go-offline


Полезно для CI и работы в поезде ✈️


👉@BookJava

Читать полностью…

Библиотека Java разработчика

👩‍💻 Rate-limiter. Bucket4j

Приглашаем на открытый урок.

🗓 24 марта в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».

Продолжаем изучать библиотеки обеспечения устойчивости приложений. На примере Bucket4j посмотрим устройство распределенного Rate-limiter-а.

О чём поговорим:

✔️ Познакомимся с библиотекой Bucket4j.
✔️ Узнаем основные принципы действия и сценарии применения.

Кому будет интересно:
Вебинар будет полезен Java-разработчикам, архитекторам ПО и инженерам по устойчивости систем, заинтересованным в эффективном управлении потоками запросов и защите приложений от перегрузок.

🔗 Ссылка на регистрацию: https://vk.cc/cJUU0G

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Читать полностью…
Subscribe to a channel