Если вы пишете на Java дольше 5 лет, вы помните эту боль. Вам просто нужно создать
Map с двумя значениями. Но Java требовала от вас целый ритуал.🐢 Как это было раньше (Java 8 и старее):
// Для списка:
List<String> list = Arrays.asList("a", "b", "c");
// Вроде ок, но этот список можно менять (set), но нельзя менять размер (add/remove).
// Для Map — вообще ужас:
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
map = Collections.unmodifiableMap(map); // Если хотим защитить от изменений
🚀 Как это делается с Java 9:
List<String> list = List.of("a", "b", "c");
Map<String, Integer> map = Map.of("one", 1, "two", 2);
Set<String> set = Set.of("a", "b", "c");
Преимущества:
1️⃣ Неизменяемость (Immutability): Эти коллекции нельзя менять. Попытка сделать
.add() или .put() сразу выбросит UnsupportedOperationException. Это делает код безопаснее (особенно в многопоточности).2️⃣ Лаконичность:
Map создается в одну строку (до 10 пар ключ-значение можно писать через запятую, дальше — через Map.ofEntries).3️⃣ Никаких null: Если вы попытаетесь положить
null в List.of или Map.of, вы сразу получите ошибку. Java приучает нас не использовать null в коллекциях.💡 Лайфхак для Java 16+:
Если вы работаете со стримами, забудьте про
.collect(Collectors.toList()).Теперь можно писать просто:
List<String> result = stream.filter(s -> s.length() > 3).toList();
Обратите внимание:
toList() возвращает неизменяемый список, в отличие от коллектора.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2👍2🤷♂1
В ООП всегда была дилемма.
Если вы делаете класс
public, от него может наследоваться кто угодно.Если делаете
final, от него не может наследоваться никто.А что, если я хочу, чтобы от моего класса
Payment могли наследоваться только CashPayment и CardPayment, и больше никто?До Java 17 приходилось придумывать костыли с пакетами. Теперь у нас есть Sealed Classes (Запечатанные классы).
Вы используете ключевое слово
sealed и через permits перечисляете, кому "можно".
public sealed interface Shape permits Circle, Square, Rectangle {
// Общие методы
}
Теперь Java (и компилятор) гарантирует: никаких других фигур, кроме этих трех, в программе существовать не может.
Наследники (
Circle, Square...) должны выбрать свою судьбу и указать один из модификаторов:1️⃣
final — от меня наследовать нельзя (конец цепочки).2️⃣
sealed — я тоже строгий, вот мой список наследников.3️⃣
non-sealed — ладно, от меня можно наследовать всем (открываем шлюз).🔥 Зачем это нужно? (Главная фишка)
Это идеально работает в связке с новым Switch.
Поскольку компилятор точно знает все возможные варианты наследников, он не потребует от вас ветку default!
String result = switch (shape) {
case Circle c -> "Это круг радиусом " + c.radius();
case Square s -> "Это квадрат";
case Rectangle r -> "Это прямоугольник";
// default не нужен! Java знает, что других фигур нет.
};
Это делает моделирование бизнес-логики (статусы заказов, типы ошибок) невероятно надежным. Если вы добавите новую фигуру, код перестанет компилироваться, пока вы не обработаете её в свитче.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍3❤🔥1❤1😁1
Признайтесь, сколько раз за свою карьеру вы писали этот уродливый код, чтобы достать последний элемент списка?
😫 Старая школа (до Java 21):
var list = List.of("A", "B", "C");
// Чтобы взять последний элемент:
String last = list.get(list.size() - 1);
// А если это Set? (LinkedHashSet)
// Приходилось использовать итератор или перегонять в список... 😱
String lastInSet = set.iterator()... // Ой, всё, лень писать.
Это было неудобно, нечитаемо и чревато ошибками (привет,
-1).🥳 Java 21 (Sequenced Collections):
В Java наконец-то добавили общий интерфейс для всех коллекций, у которых есть порядок элементов —
SequencedCollection.Теперь у
List, Deque, SortedSet и LinkedHashSet появились единые методы:
list.getFirst(); // Взять первый
list.getLast(); // Взять последний (Наконец-то!)
list.addFirst("Z"); // Добавить в начало
list.addLast("X"); // Добавить в конец
list.reversed(); // Получить представление коллекции в обратном порядке
🔥 Почему это круто?
1️⃣ Единый стандарт. Раньше у
Deque были методы getFirst, у List — get(0), у SortedSet — first(). Теперь везде одинаково.2️⃣ Работает с Set. Теперь можно легко взять первый или последний элемент из
LinkedHashSet или TreeSet, не прибегая к итераторам.3️⃣ Безопасность типов. Метод
reversed() возвращает «живое» представление. Изменения в нем отразятся на оригинале (для мутабельных коллекций).Вроде мелочь, а код становится намного чище.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍5❤1
🔥 БЕСПЛАТНЫЙ КУРС ПО СОЗДАНИЮ НЕЙРО-СОТРУДНИКОВ НА GPT И ДРУГИХ LLM 🔥
Ищете практический и углубленный курс, чтобы освоить создание нейро-сотрудников? Мы создали курс из 5 объемных занятий. Это именно то, что нужно, чтобы прокачать свои навыки абсолютно бесплатно!
📌 Темы занятий:
1. Введение в мир нейро-сотрудников
2. Как работают LLM и их аналоги
3. Создание базы знаний для нейро-сотрудника (RAG)
4. Тестирование и отладка нейро-сотрудников
5. Интеграция нейро-сотрудников в Production
Вот 5 тем курса - он максимально простой и доступный, общеобразовательный, без какого-либо сложного программирования 📚Прохождение этого курса, скорее всего, займет у вас от 1 до 3 часов
🤖 Присоединяйтесь к нашему бесплатному курсу и разберитесь в этой увлекательной теме с нами!
Ищете практический и углубленный курс, чтобы освоить создание нейро-сотрудников? Мы создали курс из 5 объемных занятий. Это именно то, что нужно, чтобы прокачать свои навыки абсолютно бесплатно!
📌 Темы занятий:
1. Введение в мир нейро-сотрудников
2. Как работают LLM и их аналоги
3. Создание базы знаний для нейро-сотрудника (RAG)
4. Тестирование и отладка нейро-сотрудников
5. Интеграция нейро-сотрудников в Production
Вот 5 тем курса - он максимально простой и доступный, общеобразовательный, без какого-либо сложного программирования 📚Прохождение этого курса, скорее всего, займет у вас от 1 до 3 часов
🤖 Присоединяйтесь к нашему бесплатному курсу и разберитесь в этой увлекательной теме с нами!
❤1🔥1
Все мы сталкивались с ситуацией, когда синтаксис требует объявить переменную, но она нам совершенно не нужна.
😒 Как мы выкручивались раньше:
Приходилось придумывать имя переменной, чтобы компилятор был доволен, а потом IDE ругалась: "Variable 'e' is never used".
try {
int number = Integer.parseInt(input);
} catch (NumberFormatException e) { // <-- Зачем нам 'e'?
// Мы и так знаем, что это не число, детали ошибки нам не важны
System.out.println("Это не число!");
}
Или в циклах:
for (var s : list) { // <-- Нам нужно просто посчитать количество, 's' не нужна
count++;
}
✅ Как стало с Java 22 (Unnamed Variables):
Теперь можно использовать символ подчеркивания _. Это сигнал компилятору: "Здесь должна быть переменная, но я не собираюсь её использовать".
try {
int number = Integer.parseInt(input);
} catch (NumberFormatException _) { // Красота!
System.out.println("Это не число!");
}
Или в паттерн-матчинге (для
instanceof и switch), если нам важен только тип, а не само значение:
if (obj instanceof String _) {
System.out.println("Да, это строка (но читать её я не буду)");
}
🔥 Почему это круто?
1️⃣ Чистота намерений: Читая код, другой разработчик сразу понимает: эта переменная игнорируется намеренно, а не по ошибке.
2️⃣ Спокойствие IDE: Анализаторы кода больше не спамят предупреждениями "Unused variable".
3️⃣ Меньше когнитивной нагрузки: Не нужно придумывать имена вроде
ignored, unused или dummy.Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍2