Секреты Java
رفتن به کانال در Telegram
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
نمایش بیشتر7 991
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
7 991
Прокачай скиллы, чтобы получить заветный оффер
Ребята из команды FAANG School собрали в одном месте гайды, шпаргалки, мануалы и чек-листы, в общем всё, что поможет стать сильными профессионалами.
Основные концепции Docker, наборы команд в JetBrains, пошаговая RoadMap по Java и множество других полезных материалов будут всегда под рукой, помогут быстро справиться со сложными вопросами и тем самым приблизят вас к высокой зп.
Библиотечный каталог постоянно пополняется, а значит, будет еще больше ценного контента. Бесплатно и навсегда!
Переходи, заглядывай в библиотеку и сохраняй полезности, если хочешь увеличить шансы устроиться в Яндекс, Amazon, Google и другие.
Попасть в библиотеку JAVA JUNIOR
7 991
📚 Здесь собраны все вопросы, которые могут спросить на собеседовании. Теперь можно легко получить оффер, подготовившись к самым популярным вопросам. Просто выбери своё направление:
1. Frontend / JavaScript
2. Python
3. Java
4. Тестировщик QA
5. Data Science
6. DevOps
7. C#
8. С/C++
9. Golang
10. PHP
11. Kotlin
12. Swift
7 991
✅ Spring аннотация
@Lazy
Как известно Spring создает бины сразу при поднятии контекста и со скоупом Singletone. Но бывают случаи, когда мы не хотим создавать его сразу. И Spring дает нам такую возможность с аннотацией @org.springframework.context.annotation.Lazy.
Эта аннотация используется в Spring Framework для отложенной инициализации бина. Это означает, что бин будет создан только при первом обращении к нему.
Мы можем использовать @Lazy над классом конфигурации:
@Lazy
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
...
}
Это значит что все бины создаваемые в этом классе будут инициализироваться при первом обращении к ним.
Либо мы можем повесить @Lazy на метод с @Bean, чтобы указать только один бин для ленивой загрузки.
Рассмотрим пример с @Autowired:
@Lazy
@ToString
@Component
public class Apple {
public Apple() {
System.out.println(
"Apple bean initialized");
}
}
У нас есть класс с аннотацией @Lazy, который так же помечен как @Component.
И есть класс куда мы инжектим этот бин:
@Component
public class Bag {
public Apple apple;
@Autowired
public Bag(@Lazy Apple apple) {
this.apple = apple;
System.out.println(
"Bag bean initialized");
}
}
Обратите внимание, что @Lazy так же и над аргументом конструктора (если инжектим через него), это обязательно!
Мы можем поднять контекст и посмотреть, что происходит:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
var context = SpringApplication
.run(Application.class, args);
System.out.println("Context is up");
Bag bag = context.getBean(Bag.class);
System.out.println("Bag is gotten");
System.out.println(bag.apple);
}
}
Вывод будет следующим:
Bag bean initialized
Context is up
Bag is gotten
Apple bean initialized
Apple()
Как мы видим - сначала создастся бин класса Bag и поднимется контекст, и только после обращения к бину Apple через Bag, бин Apple проинициализируется.
Использование аннотации @Lazy особенно полезно в больших приложениях, где не все бины нужны сразу и можно сэкономить ресурсы, инициализируя их только по мере необходимости.
🫡 Секреты Java
#java #spring #lazy7 991
7 991
✅ LocalDateTime: форматируем и парсим
В Java 8 в JSR 310 пришел достаточно удобный класс для работы с датой и временем без учета часовых поясов
LocalDateTime. Давайте рассмотрим как мы можем спарсить произвольную строку с датой и временем в объект LocalDateTime и как можем вывести LocalDateTime в нужном нам формате.
Чтобы создать объект LocalDateTime из строки с временем и датой в помщь идет класс DateTimeFormatter в котором задается формат:
String dateStr = "31-01-2022 10:15:30";
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
LocalDateTime dateTime =
LocalDateTime.parse(dateStr, formatter);
System.out.println(dateTime);
Вывод будет:
2022-01-31T10:15:30
А теперь посмотрим как превраить LocalDateTime в строку в нужном нам формате. Для этого воспользуемся методом format() класса LocalDateTime.
Например:
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter);
System.out.println(formattedDateTime);
Вывод будет (смотря когда вызываете) что-то вроде:
2024-01-21 12:43:29
Конечно, вы можете комбинировать символы в паттерне как вам угодно, чтобы получить нужный формат.
Полный список символов используемых в паттернах (а их большое количество) можно посмотреть в Java доках (ссылка).
Какие-то наиболее часто используемые форматы предопределены в DateTimeFormatter. Например DateTimeFormatter.ISO_DATE_TIME выведет дату и время в виде:
2024-01-31T10:54:39.3918743
🫡 Секреты Java
#java #java8 #localdatetime7 991
Не используй Lombok с JPA, пока не посмотришь это видео!
Lombok действительно отличный инструмент! Одна строчка кода и все твои JPA сущности перестают корректно работать 🤣
Но это только в том случае, если ты не знаешь, какие фичи Lombok можно использовать с JPA, а какие лучше не стоит.
О том, какие фичи Lombok можно использовать вместе с JPA, а какие лучше не стоит, рассказали в новом видео от Amplicode!
Хочешь больше подобного контента? Подписывайся на канал Amplicode на YouTube!
Реклама. ООО "ХОУЛМОНТ". ИНН 6316134393.
7 991
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(81 видео, 32 книги) — Go
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке
7 991
✅ Сортировка пузырьком
Сортировка пузырьком (Bubble Sort) - один из самых простых и понятных алгоритмов сортировки. Он проходит по списку несколько раз, каждый раз меняя местами соседние элементы, если они расположены в неправильном порядке.
При сортировки пузырьком сначала мы берем первый и второй элементы массива и сравниваем их, если первый элемент больше второго мы меняем их местами. Затем мы проводим эту процедуру со вторым и третьим элементом массива, и со всеми последующими. После первой итерации самый больший элемент окажется в конце массива.
Затем мы идем на вторую итерацию, но не проверяем последний элемент, т.к. он уже на своем месте после первой итерации. И так далее.
Как реализовать сортировку пузырьком:
public class BubbleSort {
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j] > arr[j+1]) {
int swap = arr[j];
arr[j] = arr[j+1];
arr[j+1] = swap;
}
}
}
}
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
System.out.println("Unsorted array:");
for (int num : arr) {
System.out.print(num + " ");
}
bubbleSort(arr);
System.out.println("\nSorted array:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
Этот код сначала выводит неотсортированный массив, затем применяет сортировку пузырьком к массиву и выводит отсортированный массив.
Сортировка пузырьком не самый эффективный алгоритм, так как его асимптотическая сложность O(n^2), но он хорош для небольших массивов или для обучения основам сортировки.
Вообще сортировки вещь, конечно, интересная, только на практике мне никогда не приходилось заниматься их реализацией. Один раз на тех собеседовании меня просили написать реализацию сортировки, но это был единственный случай.
Делитесь в комментариях у кого был опыт - где вы применяли знания по видам сортировок, и что я упускаю?
🫡 Секреты Java
#java #sort7 991
🔥 Программистика находка для каждого питониста
Проведём за ручку от самых простых проектов до сложных. Расскажем самые трудные концепции простым языком. Научим не боятся сложных задач и наслаждаться своей работой
👍Подписывайся и развивайся
7 991
Внимание, разработчики! Приглашаем вас на открытый вебинар по алгоритмам и структурам данных от опытного практикующего эксперта💯
Ждём вас на уроке «Визуальное сравнение 1-2-3 алгоритмов сортировок» от OTUS, где мы:
- подробно рассмотрим три алгоритма сортировок: Пузырьком, Вставкой и Шелла;
- сравним их по различным критериям: сложность и количество обменов, стабильность и адаптивность;
- напишем алгоритмы и сравним их быстродействие;
- продемонстрируем их работу на игральных картах🂱️
🔥 Спикер Евгений Волосатов — программист баз данных и преподаватель с огромным и разнообразным опытом, автор статей и учебных программ по C#, Java, PHP.
Встречаемся 1 июля в 20:00 мск в преддверии старта курса «Алгоритмы и структуры данных».
🔴 Регистрируйтесь на урок и подписывайтесь на бота, чтобы ознакомиться с программой курса и забронировать спецскидку 10% (акция до 30 июня): https://otus.pw/SLuO/?erid=LjN8KYdCi
7 991
📌 Составили список лучших каналов от действующих разработчиков:
Java Developer — советы и практики от действующего Senior-разработчика
Python Developer — секреты и тонкости программирования на Python
Frontend Developer — готовый код и полезные ресурсы для любого фронтендера
7 991
✅ Методы Map compute() и merge()
Они достаточно похожи: оба позволяют обновлять значения по ключу и оба метода класса Map пришли в Java 8. Но они имеют важные отличия и мы сейчас в них разберемся.
Метод
compute() позволяет выполнить операцию над значением, связанным с заданным ключом. Если ключ уже существует в Map, метод compute() обновит значение, используя заданную функцию. Если ключ не существует, compute() добавит новую пару ключ-значение в Map.
Пример:
Map<Integer, String> map = new HashMap<>();
map.put(1, "apple");
map.compute(1, (key, value) -> value + " and orange");
System.out.println(map.get(1));
// Output: apple and orange
Метод merge() позволяет объединить значения для заданного ключа. Если ключ уже существует в Map, метод merge() объединит текущее значение с новым значением, используя заданную функцию. Если ключ не существует, merge() добавит новую пару ключ-значение в Map.
Пример:
Map<Integer, String> map = new HashMap<>();
map.put(1, "apple");
map.merge(1, " and orange", (value1, value2) -> value1 + value2);
System.out.println(map.get(1));
// Output: apple and orange
Важные отличия:
▫️Аргумент BiFunction в методе compute() вызывается всегда, в методе merge() только если связанное значение не равно null
▫️Аргумент BiFunction в методе compute() принимает ключ и значение, а в методе merge() значение из мапы и значение, переданное в качестве аргумента
▫️Метод compute() выполняет операцию над текущим значением, связанным с ключом, в то время как merge() объединяет текущее значение с новым значением для заданного ключа
🫡 Секреты Java
#java #java8 #map