Java | Фишки и трюки
Открыть в Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Больше6 954
Подписчики
-124 часа
-117 дней
+1330 день
Архив постов
6 956
⌨️ Files.walkFileTree(): мощный инструмент для работы с файловой системой
Files.walkFileTree() из пакета java.nio.file позволяет рекурсивно обходить дерево каталогов и выполнять сложные операции. Это гибкий и удобный способ работать с файловой системой, включая чтение, обработку, копирование или удаление файлов.
🔍 Как это работает?
1️⃣ Реализуется интерфейс FileVisitor, который определяет действия для каждой операции.
2️⃣ Можно обрабатывать файлы и директории на каждом этапе обхода.
📌 Пример: удаление дерева каталогов
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class WalkFileTreeExample {
public static void main(String[] args) throws IOException {
Path startPath = Paths.get("example_directory");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("Deleting file: " + file);
Files.delete(file); // Удаляем файл
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("Deleting directory: " + dir);
Files.delete(dir); // Удаляем директорию после удаления её содержимого
return FileVisitResult.CONTINUE;
}
});
}
}
🔗 Ключевые методы FileVisitor:
visitFile() — вызывается для каждого файла.
postVisitDirectory() — вызывается после обхода содержимого директории.
preVisitDirectory() — вызывается перед входом в директорию.
visitFileFailed() — обрабатывает ошибки доступа.
✨ Когда использовать?
1️⃣ Для удаления, копирования или архивирования файлов/папок.
2️⃣ Для поиска файлов по сложным критериям.
3️⃣ Для выполнения массовых операций с файлами (изменение атрибутов, анализ).
💡 Совет: Используйте SimpleFileVisitor, чтобы переопределять только нужные методы, а не реализовать весь интерфейс FileVisitor.
#Java #Files #FileVisitor6 956
Почему Java - лучший язык для программирования в 2025 году?
Если вы до сих пор выбираете новое направление в IT.. рекомендую посетить канал Павла Сорокина!
Вся выжимка за 5 лет работы Java-разработчиком от ведущего специалиста!
🧑💻Выбирайте уровень подготовки и смотрите возможные решения:
— Начало положено: Только начали изучать язык, у вас все только впереди!
— Улучшение знаний: Высокий доход требует должных знаний - научитесь!
— Хочется зарабатывать: Узнаете, как пройти собеседование на топ-работу с первого раза!
6 956
⌨️ Параллельное программирование и CompletableFuture
Многопоточность позволяет выполнять несколько задач одновременно, что увеличивает производительность приложений и улучшает отзывчивость интерфейса.
Стандартный метод работы с потоками может быть сложным и запутанным.
CompletableFuture — более удобный и мощный инструмент, который упрощает асинхронное программирование.
✍️ Пример: Выполнение задач параллельно с использованием CompletableFuture
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
sleep(2000);
return "Результат задачи 1";
});
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
sleep(3000);
return "Результат задачи 2";
});
CompletableFuture<String> combined = task1.thenCombine(task2, (result1, result2) -> result1 + " & " + result2);
// Ожидаем завершения всех задач и получаем общий результат
combined.thenAccept(result -> {
long endTime = System.currentTimeMillis();
System.out.println("Общий результат: " + result);
System.out.println("Время выполнения: " + (endTime - startTime) + " мс");
});
combined.join(); // Дождёмся завершения наших задач
}
private static void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
🔧 Что происходит в коде?
1️⃣ Мы запускаем две задачи, каждая из которых выполняется асинхронно.
2️⃣ Используем метод thenCombine, чтобы объединить результаты двух задач.
3️⃣ Когда обе задачи завершены, выводим общий результат и время выполнения.6 956
import java.util.*;
public class Quest {
private static Random rnd = new Random();
public static void main(String[] args) {
StringBuffer word = null;
switch(rnd.nextInt(2)) {
case 1: word = new StringBuffer('P');
case 2: word = new StringBuffer('G');
default: word = new StringBuffer('M');
}
word.append('a');
word.append('i');
word.append('n');
System.out.println(word);
}
}6 956
Что вы мечтали получить в подарок к новому году в детстве? Велик, плюс 3 месяца каникул, десять порций мороженого? Эх, детство-детство...
НО сейчас-то мы взрослые, умные и осознанные люди – точно знаем, что не бывает ничего лучше, чем собственная база знаний.
Принимайте предновогодний подарок – папка "База знаний", в которой собраны ценные каналы, где вы найдете:
▫️Здесь будет много про Пересечение технологий, профессий и реальной жизни.
▫️ Анонсы ивентов из мира IT (митапы, конференции, вебинары, интенсивы, воркшопы).
▫️ Java задачи и тесты
В общем, все не перечислить, поэтому – сохраняйте-> Базу знаний - «Разработка», изучайте, выбирайте максимально ценные для вас каналы или подписывайтесь на все. Знаний много не бывает 😉
Хотите в следующую подборку ?
6 956
⌨️ Как управлять порядком элементов в LinkedHashMap?
LinkedHashMap — это реализация Map, которая сохраняет порядок добавления элементов. Но что, если нужен порядок по использованию (LRU-кэш)? LinkedHashMap справится и с этим!
Порядок добавления (по умолчанию):
java
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapExample {
public static void main(String[] args) {
Map<Integer, String> map = new LinkedHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
System.out.println(map); // {1=One, 2=Two, 3=Three}
}
}
Порядок использования:
Передайте accessOrder = true в конструктор.
java
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUExample {
public static void main(String[] args) {
Map<Integer, String> map = new LinkedHashMap<>(16, 0.75f, true);
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.get(2); // Используем ключ 2
System.out.println(map); // {1=One, 3=Three, 2=Two}
}
}
Можно переопределить метод removeEldestEntry() для автоматического удаления старых записей.
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
return size() > 3; // Удалять записи, если их больше 3
}
#Java #LinkedHashMap #LRU6 956
Эффективная разработка на Spring Boot без ограничений.
Пока зарубежные компании отзывают лицензии у пользователей РФ, Amplicode продолжает помогать максимально удобно работать со Spring Boot, JPA, Docker, Kafka, Liquibase, MapStruct и т.д.
Amplicode можно установить как плагин в IntelliJ IDEA Community и Ultimate, а также в Giga IDE.
Что умеет Amplicode?
⚡ Легкая навигация по проекту
⚡ Создание объектов сразу в терминах фреймворка: контроллеры, репозитории, сервисы, сущности, события, DTO, мапперы и т.д.
⚡ Палитра и инспектор, позволяющие видеть опции, доступные разработчику в текущем контексте
⚡ Умные инжекции, подсказки и исправление ошибок
⚡ и многое другое!
А самое главное, Amplicode доступен бесплатно и без региональных ограничений!
Познакомьтесь со всеми возможностями Amplicode
Читайте наш гайд: «Как превратить IntelliJ IDEA Community Edition в Ultimate за 3 простых шага»
6 956
⌨️ WeakHashMap: когда удаление происходит само собой
WeakHashMap — это коллекция, которая позволяет ключам удаляться из неё автоматически, если на них больше нет сильных ссылок.
Если ключ в WeakHashMap становится недостижимым (нет сильных ссылок), он удаляется сборщиком мусора.
Это делает WeakHashMap полезной для реализации кэшей и других структур, где нужно избегать утечек памяти.
📌 Пример:
java
import java.util.WeakHashMap;
public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<Object, String> map = new WeakHashMap<>();
Object key = new Object();
map.put(key, "Value");
System.out.println("Before GC: " + map); // Ключ и значение есть
key = null; // Убираем сильную ссылку на объект
System.gc(); // Вызываем сборку мусора
System.out.println("After GC: " + map); // Ключ и значение исчезли
}
}
Пока объект-ключ доступен, пара ключ-значение остаётся в WeakHashMap.
Как только ключ становится недоступным, он автоматически удаляется сборщиком мусора.
✨ Когда использовать?
1️⃣ Кэширование: для хранения данных, которые можно восстановить, если они удалены.
2️⃣ Маппинг вспомогательных данных: например, привязка метаданных к объектам, где их удаление важно.
💡 Совет:
Не используйте WeakHashMap для данных, которые критически важны — сборщик мусора может удалить их в любой момент!
#Java #WeakHashMap6 956
Придумать, что дарить близким, — ежегодная задача со звёздочкой. А ведь в детстве можно было просто сделать подарок своими руками. Чуть-чуть картона, чуть-чуть ваты и частичку души.
Яндекс Практикум запустил Студию цифровых поделок, где вы снова сможете делать подарки своими руками, но уже с помощью нейросетей и онлайн-сервисов. Выберите настроение, настройте параметры — и алгоритмы подскажут, что и как можно смастерить.
А ещё на странице студии вас ждут приятные бонусы и скидки от Практикума и других сервисов Яндекса.
🎁 Забрать идеи для близких и подарки для себя
6 956
⌨️ Как работает
IdentityHashMap
IdentityHashMap — это необычная реализация Map, которая использует сравнение по ссылкам (==) вместо стандартного метода equals().
В IdentityHashMap два ключа считаются равными только если это один и тот же объект (сравнение по ссылкам).
📌 Пример:
java
import java.util.IdentityHashMap;
import java.util.Map;
public class IdentityHashMapExample {
public static void main(String[] args) {
Map<String, String> map = new IdentityHashMap<>();
String key1 = new String("key");
String key2 = new String("key");
map.put(key1, "Value 1");
map.put(key2, "Value 2");
System.out.println(map); // Выведет обе пары: {key=Value 1, key=Value 2}
}
}
key1 и key2 — это разные объекты, даже если их строки одинаковы.
✨ Когда использовать?
1️⃣ Кэширование: если нужно различать объекты с одинаковыми данными.
2️⃣ Оптимизация: для низкоуровневой работы с объектами, где важна ссылка, а не значение.
3️⃣ Специфические задачи: при разработке компиляторов, интерпретаторов или для отслеживания уникальных объектов.
💡 Ограничение:
IdentityHashMap не гарантирует порядок элементов и редко используется в стандартных задачах. Это инструмент для узкоспециализированных случаев!
#Java #IdentityHashMap6 956
⌨️ EnumMap — это реализация Map, которая использует в качестве ключей исключительно
Enum.
Внутренне EnumMap использует массив для хранения значений, где индекс массива соответствует порядковому номеру (ordinal()) элемента перечисления. Это делает его быстрее, чем хэш-таблицы (HashMap) и более экономным по памяти.
EnumMap хранит ключи в порядке их объявления в перечислении, что отличает его от большинства других Map (кроме LinkedHashMap).
Так как ключи строго ограничены перечислением, это снижает вероятность ошибок при разработке.
🔍 Пример:
import java.util.EnumMap;
enum Action {
START, STOP, PAUSE
}
public class EnumMapExample {
public static void main(String[] args) {
EnumMap<Action, Runnable> actionMap = new EnumMap<>(Action.class);
// Определяем поведение для каждого значения Enum
actionMap.put(Action.START, () -> System.out.println("Starting the process..."));
actionMap.put(Action.STOP, () -> System.out.println("Stopping the process..."));
actionMap.put(Action.PAUSE, () -> System.out.println("Pausing the process..."));
// Пример вызова
Action currentAction = Action.START;
actionMap.get(currentAction).run();
}
}
#Java #EnumMap6 956
public class Quest {
public static void greet() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Quest q = null;
q.greet();
}
}6 956
public class Quest {
public static void main(String[] args) {
String s = null;
System.out.println(s instanceof String);
}
}6 956
🌱 Spring SpEL (Spring Expression Language) — это мощный язык выражений, предоставляемый фреймворком Spring. Он используется для динамической обработки данных, управления конфигурацией и вычисления значений в runtime. SpEL позволяет обращаться к свойствам объектов, вызывать методы, работать с коллекциями, выполнять арифметические и логические операции, а также взаимодействовать с бинами Spring.
Основные возможности SpEL:
✔️ Обращение к свойствам:
person.name
✔️Вызов методов: person.getName()
✔️ Работа с коллекциями: фильтрация и проекция (list.?[property > 10]).
✔️ Логические и арифметические операции: age > 18 && hasLicense
✔️ Доступ к бинам Spring: @beanName.method()
Простой пример:
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class SpELExample {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
// Пример вычисления простого выражения
String expression = "'Hello, Spring SpEL!'.toUpperCase()";
String result = parser.parseExpression(expression).getValue(String.class);
System.out.println(result); // Вывод: HELLO, SPRING SPEL!
}
}
Использование в аннотациях:
@Component
public class MyBean {
@Value("#{T(java.lang.Math).random() * 100}")
private double randomValue;
@Value("#{systemProperties['user.name']}")
private String userName;
public void printValues() {
System.out.println("Random Value: " + randomValue);
System.out.println("User Name: " + userName);
}
}
✔️ T(java.lang.Math).random() — вызов статического метода Math.random().
✔️ systemProperties['user.name'] — доступ к системным свойствам.
Использование с коллекциями:
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import java.util.Arrays;
import java.util.List;
public class CollectionExample {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// Фильтрация списка
List<Integer> filteredNumbers = (List<Integer>) parser.parseExpression(
"#numbers.?[#this > 2]").getValue(new StandardEvaluationContext(), numbers);
System.out.println(filteredNumbers); // Вывод: [3, 4, 5]
}
}
SpEL является удобным инструментом для внедрения динамического поведения и вычислений в приложениях Spring.6 956
Turrit - на основе Telegram
(для iOS и Android)
Turrit является бесплатным сторонним клиентом, разработанным на основе Telegram API. В нем:
🔅 AI-переводчики
🚀 ускорение загрузки в 20 раз
💭 неограниченное облачное хранилище
🌏 онлайн-просмотр видео TikTok
💫 элегантный и простой интерфейс
⛓ защита безопасности и конфиденциальности
В настоящее время у Turrit уже более 100 000 ежедневных активных пользователей. В России он также пользуется признанием, вот в форуме 4PDA идет горячее обсуждение.
Скачать можно в Google Play и App Store.
Присоединяйтесь к официальной группе Turrit!
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
