Java с нуля до middle
153 subscribers
56 photos
14 links
Download Telegram
Кто нибудь попробывал реализовать интерфейс?
Anonymous Poll
22%
Да
36%
Нет
53%
Новый год завтра!
Вот реализация
https://codeshare.io/eVRnWJ

Пишите, тесты, я свои напишу позже
https://codeshare.io/WdqD9E

Написал пару тестов, остальные сами пишите, если не выйдет пишите в коменты помогу.

Это совершенно типичное задание для джуна на работе, реализация интерфейса, тесты.
С Новым годом!!! 🎄
Желаю вам в новом году доучить джаву и найти работу.
Всем мир! ✌️
👍154
Функциональный интерфейс

Появился в java 8, содержит один единственный абстрактный метод.

Дан интерфейс, дана лямбда.
Задание переписать лямбду в анонимный класс, решение в комментах.
Predicate

Интерфейс который предоставляет boolean метод test(). В основном используется для фильтрации данных из потока. Можно еще всякие проверки писать, типа есть соединения с бд, отправляет ли в кафку. Ну и запускать шедулер когда тру.

На картинке написал предикат, который проверяет содержится ли в стринге буква "c". Метод тест возвращает true, если элемент есть.

Задание:
Дан массив стрингов написать цепочку предикатов на поиск элементов содержащих "a", "c".
Решение в комментах
👍2
Function

Интерфейс принимает объект одного типа и возвращает другого.

На картинке мы считаем количество символов в стринг.
apply() как раз тот метод куда мы пихаем стринг и ожидаем что он нам выведет Integer, т.к в function мы определили s.length()

Задание:
Посчитать количество символов у массива стрингов, через stream.
Решение в комментах
Consumer

Интерфейс принимает объект и выполняет над ним операцию

На картинке мы прибавляем к инту двойку и выводим значение. Стоит заметить, что инт не изменяется и остается единицей, т.к в консьюмере создается копия.

Задача:
К массиву интов прибавить двойку и вывести это на экран. Сделать это через stream.
Решение сами знаете где)
Supplier

Интерфейс в Java, который представляет функцию, которая не принимает никаких аргументов и возвращает результат. Имеет один единственный абстрактным метод get().

На картинке мы создаем массив интов и потом записываем его с помощью get.

Задание:

Создать стрим интов, сгенерировать в нем 100 рандомных чисел, далее вывести 20 из них в консоль.
Решение в комментах
Comparator

Интерфейс, который принимает в метод int compare(o1, o2) два значения и возвращает целое число, знак которого определяет правило сортировки. Возвращает 1, -1, 0

На картинке определим сравнения строк в обратном порядке, то есть если строка больше, то она будет выше. Если переставить местами a и b, будет обычная сортировка.

Задача:

String[] str = {"apple" ,"nike", "oppo", "lenovo", "puma", "mercedes"};

Создать стрим из этого массива, отcортировать по возрастанию символов в слове, если символов одинаковое количество, сортировать по алфавиту.
Решение в комментах
Задача с собеса

Даны три отсортированных массива, одинаковой длины. Найти и вывести одинаковые элементы

Решение в комментах
🔥4
Задача

Даны целые числа N и K, и последовательность из N целых чисел. Циклически сдвинуть все элементы последовательности на K элементов вправо.

Кто может решить?)
Многопоточка

Что делает этот код?
1. Создаем переменную counter, которую будем увеличивать
2. Создаем метод increment, в котором увеличиваем переменную на 1
3. Создаем класс R, который имплементирует Runnable и переопределяем метод run.
4. в методе run вызываем increment() 1000 раз
5.Создаем в main два потока и пихаем туда наш класс. Стартуем потоки через start() и просим их дождаться главного потока main, через join()
6. Выводим результат
Какой будет результат?
Anonymous Quiz
26%
2000
2%
1500
4%
0
68%
Всегда разный
Какой из потоков начнет работу первый? Они начнут работу в одно время? С одинаковой ли скоростью они работают?
Мы этого не знаем и гарантировать не можем.

Что выходит на практике, первый поток вызывает метод increment, и увеличивает count допустим до 200 сохраняя в память. Второй так же сразу начинает работу, но работает медленнее и за это же время увеличивает только до 100 и сохраняет в память, переписывая прошлое значение.

Первый поток что-то подвис, допустим ядро отвлеклось на другую задачу и до того, как он пробудится и начнет увеличивать снова, он берет число из память, а это число 100, а не 200. Вот тут и появляются проблема, называется она Data race.

Решить ее можно синхронизацией метода increment, написав public static synchronized void increment() . Это означает что дергать метод разные потоки будут строго по очереди.

Лучше переписать это через AtomicInteger. AtomicInteger имеет потокобезопасный метод getAndIncrement().
Но так никто не делает...

Хотите отслеживать состояние и более эффективно управлять потокам. Используйте ExecutorService.

На скрине переписал код
В этом коде создается объект ExecutorService с использованием метода newFixedThreadPool(2) из класса Executors. Это создает пул потоков с фиксированным размером 2, что означает, что может быть запущено не более 2 задач одновременно.

Далее в коде вызываются методы execute(new R()), которые отправляют задачи на выполнение в пул потоков. Задачи будут выполняться в одном из свободных потоков из пула.

Затем вызывается метод awaitTermination(1, TimeUnit.SECONDS), который блокирует выполнение потока, в котором он был вызван, до тех пор, пока все задачи из пула потоков не будут завершены или не истечет время 1 секунда.

Далее вызывается метод shutdownNow(), который прекращает прием новых задач и завершает текущие задачи как можно скорее.
Какой будет результат
Anonymous Quiz
23%
6000
23%
12000
53%
Всегда разный
https://www.youtube.com/watch?v=-e1_QhJ1EhQ

Это вам мотивация, почему надо быть связанным с технологиями, получать тех образование или просто постоянно быть в контексте происходящего!
👍3
Написал тут быструю приложуху как работает Hibernate
https://github.com/IvanKorni/hiber-h2

Есть worker у него только имя и фамилия, задача сохранить его в бд h2. Сделать это только с помощью Hibernate.

После сохранения вывести всех воркеров из бд.

Задание:
1. Сломать прогу, сделать так что бы был все время rollback при сохранении
2. Сделать логирование
3. Поднять кеш второго уровня
4. Достать одного воркера по фамилии
5. Задача посложнее: убрать из мейна все это, разнести все по слоям, сделать метод на сохранение и получение, написать тесты

Скидывайте код, я гляну
👍2
Всем привет, залил на гитхаб можете смотреть.
Т.к никто ничего не понял, буду делать голосование и объяснять темы подробнее, хибер и работа с бд это основа, должны понимать все.
👍2