Java | Фишки и трюки
Открыть в Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Больше6 953
Подписчики
-324 часа
-27 дней
+630 день
Архив постов
6 954
☕️Библиотека 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);
}
}6 954
☕️Лямбда-выражения и 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 - 💬Терминальные операции завершают цепочку - 💬Оптимизированная работа с памятью
6 954
☕️Фишка 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.⏺ Более читаемый и выразительный код
6 954
+4
⚡️ Linux теперь в Telegram!
Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами
Подписывайтесь: @linuxos_tg
6 954
☕️ 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 предоставляет мощные инструменты для работы с графами, что делает его незаменимым для решения задач оптимизации, анализа сетей и многих других областей, где применяется теория графов.6 954
⚡ Новые каналы с вакансиями и стажировками для джунов
В этих каналах публикуются все свежие вакансии и стажировки
🔺 ВАКАНСИИ
Горячие вакансии с привлекательными офферами для джуниор разработчиков, аналитиков, дизайнеров и QA-специалистов.👉 ПОДПИСАТЬСЯ 🔺СТАЖИРОВКИ
Стажировки для начинающих специалистов в IT независимо от возраста!👉 ПОДПИСАТЬСЯ 🔺IT interns
Свежие стажировки для junior специалистов в топовых компании России и мира👉 ПОДПИСАТЬСЯ 🔺Junojobs
Вакансии и стажировки для junior-разработчиков на удалёнке.👉 ПОДПИСАТЬСЯ 🔺БИГТЕХ
Junior вакансии и стажировки в крупнейших IT-компаниях мира: NVidia, Apple, T-банк, Яндекс, Google и т. д.👉 ПОДПИСАТЬСЯ 🔺Макс из < codereview />
Эксперименты про трудоустройство в IT, советы для быстрого поиска работы и офферы для джунов.👉 ПОДПИСАТЬСЯ
6 954
☕️Библиотека 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
6 954
Каждый день без изучения ИИ — это упущенная возможность
Пока другие осваивают нейросети и зарабатывают на этом, вы тратите время впустую.
Канал «That's IT» — проводник в мире технологий, интернет-культуры, трендов и нейросетей.
Здесь вы найдете:
— Ежедневные дайджесты главных новостей ИИ.
— Эксклюзивные инсайты о разработках и технологиях
— Айтишный юмор и немного милых котиков
Подписывайтесь и читайте самое важное из мира искуственного интеллекта: @thats_it_ai_tech
6 954
☕️ 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-выражения идеально подходят для реализации функциональных интерфейсов, которые имеют только один абстрактный метод.6 954
Время автоматизировать QA на JavaScript 🌚
Автоматизация шагает вперед: спрос на автотесты на JS продолжает расти!
По данным последнего опроса Stack Overflow, больше 60% QA-инженеров начинают карьеру с изучения JS. И даже фреймворк Allure 3, который раньше ассоциировался в основном с Java, теперь переписан на JavaScript.
В этот четверг в 20:00 (мск) у школы QA-инженеров QA.GURU пройдет вебинар по автоматизации тестирования на JavaScript.
👉 На занятии вы узнаете о профессии QA и трендах профессии.
👉 Поработаете с фреймворком Playwright.
👉 Напишете и запустите свой автотест на JS.
А еще после урока вас ждет полноценная домашка, которую проверит преподаватель школы. Все участники вебинара получат обратную связь по ДЗ.
🔗 Зарегистрируйтесь на открытый урок, чтобы получить ссылку на трансляцию.
Попробуйте себя в новой профессии!
6 954
⌨️ Неочевидный момент: Переполнение при умножении
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.6 954
Вы ведь тоже хотите изучать программирование с легкостью и вдохновением?
Мой коллега из FAANG открыл свои каналы, где объясняет сложные темы простым языком, дерзайте 🔥
🐍 Ghostly Python - Разбираем код, автоматизируем рутину, пишем ботов, скрипты и полезные утилиты. Все что нужно для уверенного старта в программировании на Python.
☕️ Easy Java - вскрываем Java изнутри. Все тонкости этого универсального языка в одном канале, врывайся!
😎 IT Syndicate - петабайты свежего материала по всем направлениям. Backend, DevOps, Frontend - и это лишь малая часть..
6 954
☕️ 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. Это делает его незаменимым для разработки фреймворков, систем аспектно-ориентированного программирования и инструментов профилирования.6 954
🔍Тестовое собеседование на Middle Java-разработчика завтра
26 марта(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в Т1, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqx4kzGQ
6 954
⚡️ Как ускорить работу
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 #performance6 954
⌨️ Java | Tests - проверь свои знания в Java!
Только тесты, ничего лишнего!
Присоединяйся! 😉
👉 @java_tsts
6 954
☕️ 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-документов.6 954
Битрикс24
💻Один онлайн-сервис для совместной работы.
📱10+ инструментов.
✅0 денег.
Счастливые сотрудники. Прибыльный бизнес.
Регистрируйтесь и забирайте себе
Зарегистрироваться
#реклама 16+
office-online.bitrix24.ru
О рекламодателе
6 954
⌨️ Сравнение
ArrayList vs LinkedList
Оба класса реализуют List, но имеют разные внутренние структуры и производительность.
ArrayList использует динамический массив, а LinkedList использует двусвязный список.
🤔 Что выбрать?
✔️ Используйте ArrayList, если важен быстрый доступ по индексу и добавление в конец.
✔️ Используйте LinkedList, если часто удаляете/вставляете элементы в середину.
📌 ArrayList чаще предпочтительнее, так как LinkedList требует больше памяти и редко даёт преимущества. 🚀6 954
🖥 Наконец-то нормальный канал по Python!
PytStart – для каждого питониста!
🔸 Полезные статьи
🔸 Лайфхаки и советы
🔸 Разбор кода и практические задания
Присоединяйся и начни свой путь в Python уже сегодня: @pytstart
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
