Совет по Java 💡
Хотите создавать JPA-запросы с помощью стандартных потоков Java? Вы можете использовать библиотеку JPAstreamer (https://jpastreamer.org). Она может быть интегрирована, например, в Spring Boot.
#jpa #java #streams #hibernate
👉
Хотите создавать JPA-запросы с помощью стандартных потоков Java? Вы можете использовать библиотеку JPAstreamer (https://jpastreamer.org). Она может быть интегрирована, например, в Spring Boot.
#jpa #java #streams #hibernate
👉
Подборка Telegram каналов для программистов
Системное администрирование 📌
Типичный Сисадмин (фото железа, было/стало)
Книги для админов, полезные материалы
Все для системного администратора
Библиотека Системного Администратора
Чат системных администраторов
DevOps: Пишем о Docker, Kubernetes и др.
Новости Линукс Linux
Новости высоких технологий, науки и техники💡
Мир технологий (Technology World)
Полезный контент по программированию на Rust
Библиотека Go (Golang) разработчика
Программисты, дизайнеры, новости из мира IT.
Обучающие видео, книги по Физике и Математике
Библиотека PHP программиста 👨🏼💻👩💻
Подборки по Node js и все что с ним связано
Библиотека Ruby программиста
1C разработка 📌
Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
Библиотека C/C++ разработчика
Книги для программистов C/C++
Учим C/C++ на примерах
Программирование Python 📌
Python академия. Учи Python быстро и легко🐍
Библиотека Python разработчика
Python подборки на русском и английском
Книги по Python Rus
Java разработка 📌
Библиотека Java разработчика
Книги по Java Rus
Учим Java на примерах
GitHub Сообщество 📌
Интересное из GitHub
Базы данных (Data Base) 📌
Все про базы данных
Мобильная разработка: iOS, Android 📌
Мобильная разработка
Подборки полезного материала по Kotlin
Фронтенд разработка 📌
Подборки для frontend разработчиков
Frontend советы, примеры и практика!
Подборки по React js и все что с ним связано
Разработка игр 📌
Все о разработке игр
Вакансии 📌
Системный Администратор
Вакансии в IT
Чат программистов📌
Библиотеки 📌
Книги для программистов Rus
Книги по программированию
Библиотека программиста
Книги для программистов
Книги для программистов
БигДата, машинное обучение 📌
Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
Лекции, видеоуроки, доклады с IT конференций
Полезные советы по программированию
QA, тестирование 📌
Библиотека тестировщика
Шутки программистов 📌
Шутки программистов
Защита, взлом, безопасность 📌
Канал о кибербезопасности
Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
Статьи, книги для дизайнеров
Английский 📌
Английский с нуля
Математика 📌
Канал по математике
Excel лайфхак📌
Системное администрирование 📌
Типичный Сисадмин (фото железа, было/стало)
Книги для админов, полезные материалы
Все для системного администратора
Библиотека Системного Администратора
Чат системных администраторов
DevOps: Пишем о Docker, Kubernetes и др.
Новости Линукс Linux
Новости высоких технологий, науки и техники💡
Мир технологий (Technology World)
Полезный контент по программированию на Rust
Библиотека Go (Golang) разработчика
Программисты, дизайнеры, новости из мира IT.
Обучающие видео, книги по Физике и Математике
Библиотека PHP программиста 👨🏼💻👩💻
Подборки по Node js и все что с ним связано
Библиотека Ruby программиста
1C разработка 📌
Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
Библиотека C/C++ разработчика
Книги для программистов C/C++
Учим C/C++ на примерах
Программирование Python 📌
Python академия. Учи Python быстро и легко🐍
Библиотека Python разработчика
Python подборки на русском и английском
Книги по Python Rus
Java разработка 📌
Библиотека Java разработчика
Книги по Java Rus
Учим Java на примерах
GitHub Сообщество 📌
Интересное из GitHub
Базы данных (Data Base) 📌
Все про базы данных
Мобильная разработка: iOS, Android 📌
Мобильная разработка
Подборки полезного материала по Kotlin
Фронтенд разработка 📌
Подборки для frontend разработчиков
Frontend советы, примеры и практика!
Подборки по React js и все что с ним связано
Разработка игр 📌
Все о разработке игр
Вакансии 📌
Системный Администратор
Вакансии в IT
Чат программистов📌
Библиотеки 📌
Книги для программистов Rus
Книги по программированию
Библиотека программиста
Книги для программистов
Книги для программистов
БигДата, машинное обучение 📌
Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
Лекции, видеоуроки, доклады с IT конференций
Полезные советы по программированию
QA, тестирование 📌
Библиотека тестировщика
Шутки программистов 📌
Шутки программистов
Защита, взлом, безопасность 📌
Канал о кибербезопасности
Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
Статьи, книги для дизайнеров
Английский 📌
Английский с нуля
Математика 📌
Канал по математике
Excel лайфхак📌
Collection.removeIf
Метод перебирает коллекцию, и удаляет те элементы, которые соответствуют
В нашем примере мы в одну строку удаляем из списка все числа больше 5.
👉
Метод перебирает коллекцию, и удаляет те элементы, которые соответствуют
filter
.В нашем примере мы в одну строку удаляем из списка все числа больше 5.
👉
В чем разница между JavaEE, JavaSE и JavaME?
Как язык программирования, в рамках одной версии Java везде приблизительно одинаковая. С точки зрения платформы, существуют разные вариации:
• Standard Edition (SE) – основной набор.
• Enterprise Edition (EE) – стандартная версия, с дополнительными интерфейсами корпоративных web-технологий.
• Micro Edition (ME) – для платформ, сильно ограниченных в ресурсах. Интернет вещей, Raspberry PI, умные телевизоры. Если помните, игры для старых телефонов имели расширение .jar.
• Java Card – джава для банковских и SIM-карт. Подмножество основного языка, с урезанной библиотекой, измененным байткодом, и упором на безопасность. Когда в окне инсталлятора баннер заявляет «3 Billion Devices Run Java», в счёт идут и карточки.
• JavaFX – платформа для десктопных приложений, замена Swing. Сейчас живет как отдельный opensource-проект.
👉
Как язык программирования, в рамках одной версии Java везде приблизительно одинаковая. С точки зрения платформы, существуют разные вариации:
• Standard Edition (SE) – основной набор.
• Enterprise Edition (EE) – стандартная версия, с дополнительными интерфейсами корпоративных web-технологий.
• Micro Edition (ME) – для платформ, сильно ограниченных в ресурсах. Интернет вещей, Raspberry PI, умные телевизоры. Если помните, игры для старых телефонов имели расширение .jar.
• Java Card – джава для банковских и SIM-карт. Подмножество основного языка, с урезанной библиотекой, измененным байткодом, и упором на безопасность. Когда в окне инсталлятора баннер заявляет «3 Billion Devices Run Java», в счёт идут и карточки.
• JavaFX – платформа для десктопных приложений, замена Swing. Сейчас живет как отдельный opensource-проект.
👉
👩💻 Курс для Java-разработчиков, которые хотят профессионального роста.
Пройди тест по Java и проверь свои знания, готов ли ты к обучению на курсе.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cxzaTC
Пройди тест по Java и проверь свои знания, готов ли ты к обучению на курсе.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cxzaTC
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Otus
Курсы программирования на Java, онлайн курс по Java разработке, курсы по Java, курсы «Джава». Запишись на курсы программирования…
Мы выпускаем после наших курсов крутых Java программистов. Уникальное обучение языку программирования основаному на джава, с возможностью трудоустройства
🚀 Протестируйте приложение с помощью Taikai
Taikai - это мощное расширение популярной библиотеки
https://github.com/enofex/taikai
👉
Taikai - это мощное расширение популярной библиотеки
ArchUnit
, предлагающее полный набор предопределенных правил, адаптированных для различных технологий. 🔥https://github.com/enofex/taikai
👉
Где у Java приложения точка входа?
В обычном Java приложении всегда должен быть
main обязательно
В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
Когда приложение запускается как
Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл
В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы
👉
В обычном Java приложении всегда должен быть
main class
, содержащий метод main
. С него начинается исполнение всей программы. Main class
-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application
.main обязательно
public static
. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
String[]
и String
... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.Когда приложение запускается как
classpath
, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class
.Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл
META-INF/MANIFEST.MF
добавляется строчка вида Main-Class: ru.google.com.MyClass
. Иначе запуск завершается ошибкой «no main manifest attribute
».В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы
init
и start
. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.👉
⌨️ Только начинаете свой путь в Java-разработке?
Ждём вас на открытом практическом уроке «Сборка приложения на Java» от OTUS, где мы:
- рассмотрим, как запустить и собрать исполняемый jar-файл;
- добавим в него ресурсы;
- запустим Java-приложение;
- научимся использовать утилиты javac и java, jvm, jre, jdk и classpath.
Спикер Андрей Поляков — старший разработчик в международной финтех-компании.
Встречаемся 18 июня в 20:00 мск в рамках курса «Специализация Java-разработчик».
Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cxCQ9t
Ждём вас на открытом практическом уроке «Сборка приложения на Java» от OTUS, где мы:
- рассмотрим, как запустить и собрать исполняемый jar-файл;
- добавим в него ресурсы;
- запустим Java-приложение;
- научимся использовать утилиты javac и java, jvm, jre, jdk и classpath.
Спикер Андрей Поляков — старший разработчик в международной финтех-компании.
Встречаемся 18 июня в 20:00 мск в рамках курса «Специализация Java-разработчик».
Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cxCQ9t
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Hibernate и спецификация JPA: приключение на 20 минут
На прошлой неделе в блоге сообщества Spring АйО вышла статья-перевод про интересный кейс падения производительности при переходе на Hibernate 6.5. Оказалось, что выражения вида publisherId in :ids при пустом ids приводит к серьезной деградации производительности. Баг вскоре был пофикшен, однако, не дает покоя вопрос, почему так произошло?
Ниже приводим историю появления и незамедлительного решения этой проблемы, от лица Гэвина Кинга, создателя Hibernate.
https://habr.com/ru/companies/spring_aio/articles/821307/
👉
На прошлой неделе в блоге сообщества Spring АйО вышла статья-перевод про интересный кейс падения производительности при переходе на Hibernate 6.5. Оказалось, что выражения вида publisherId in :ids при пустом ids приводит к серьезной деградации производительности. Баг вскоре был пофикшен, однако, не дает покоя вопрос, почему так произошло?
Ниже приводим историю появления и незамедлительного решения этой проблемы, от лица Гэвина Кинга, создателя Hibernate.
https://habr.com/ru/companies/spring_aio/articles/821307/
👉
🚀 Готовься к переменам в мире IT с нашим практическим курсом по Domain Driven Design!
😰 Устал от запутанной инфраструктуры, вперемешку с бизнес логикой? Мы знаем, как это тяжело. Писать тесты становится неприятно и больно, приходится много мокать, тесты получаются огромными, хрупкими.. Но есть решение! Присоединяйся к нашему курсу, где мы разложим все по полочкам за 10 вебинаров, начиная с 17 июня.
🔝 Прими вызов и стань частью передовой волны технологического прогресса. Успей зарегистрироваться сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwL1BZQ&utm_campaign=1
🎓 На нашем курсе ты изучишь:
✅ Основы Domain-Driven Design и его важность для разработчиков.
✅ Создание эффективных и масштабируемых сервисов с использованием DDD.
✅ Применение шаблонов проектирования и принципов DDD для оптимизации кода и повышения производительности.
💡 Зачем тебе этот курс?
🌟 Плюс, ты получишь:
— Новые подходы к разработке, в том числе и использование подходов ядра и с...
😰 Устал от запутанной инфраструктуры, вперемешку с бизнес логикой? Мы знаем, как это тяжело. Писать тесты становится неприятно и больно, приходится много мокать, тесты получаются огромными, хрупкими.. Но есть решение! Присоединяйся к нашему курсу, где мы разложим все по полочкам за 10 вебинаров, начиная с 17 июня.
🔝 Прими вызов и стань частью передовой волны технологического прогресса. Успей зарегистрироваться сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwL1BZQ&utm_campaign=1
🎓 На нашем курсе ты изучишь:
✅ Основы Domain-Driven Design и его важность для разработчиков.
✅ Создание эффективных и масштабируемых сервисов с использованием DDD.
✅ Применение шаблонов проектирования и принципов DDD для оптимизации кода и повышения производительности.
💡 Зачем тебе этот курс?
🌟 Плюс, ты получишь:
— Новые подходы к разработке, в том числе и использование подходов ядра и с...
Что такое «лямбда»? Какова структура и особенности использования лямбда-выражения?
Лямбда представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы.
Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.
Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.
По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.
Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.
Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:
Конечные лямбда-выражения не обязаны возвращать какое-либо значение.
Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:
Передача лямбда-выражения в качестве параметра метода:
👉
Лямбда представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы.
Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.
Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.
interface Operationable {
int calculate(int x, int y);
}
public static void main(String[] args) {
Operationable operation = (x, y) -> x + y;
int result = operation.calculate(10, 20);
System.out.println(result); //30
}
По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.
Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.
Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:
operation = (int x, int y) -> x + y;
//При написании самого лямбда-выражения тип параметров разрешается не указывать:
(x, y) -> x + y;
//Если метод не принимает никаких параметров, то пишутся пустые скобки, например:
() -> 30 + 20;
//Если метод принимает только один параметр, то скобки можно опустить:
n -> n * n;
Конечные лямбда-выражения не обязаны возвращать какое-либо значение.
interface Printable {
void print(String s);
}
public static void main(String[] args) {
Printable printer = s -> System.out.println(s);
printer.print("Hello, world");
}
Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:
Operationable operation = (int x, int y) -> {
if (y == 0) {
return 0;
}
else {
return x / y;
}
};
Передача лямбда-выражения в качестве параметра метода:
interface Condition {
boolean isAppropriate(int n);
}
private static int sum(int[] numbers, Condition condition) {
int result = 0;
for (int i : numbers) {
if (condition.isAppropriate(i)) {
result += i;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
}
👉
К каким переменным есть доступ у лямбда-выражений?
Доступ к переменным внешней области действия из лямбда-выражения очень схож к доступу из анонимных объектов. Можно ссылаться на:
⚫️неизменяемые (effectively final - не обязательно помеченные как
⚫️поля класса;
⚫️статические переменные.
К методам по умолчанию реализуемого функционального интерфейса обращаться внутри лямбда-выражения запрещено.
Как отсортировать список строк с помощью лямбда-выражения?
👉
Доступ к переменным внешней области действия из лямбда-выражения очень схож к доступу из анонимных объектов. Можно ссылаться на:
⚫️неизменяемые (effectively final - не обязательно помеченные как
final
) локальные переменные;⚫️поля класса;
⚫️статические переменные.
К методам по умолчанию реализуемого функционального интерфейса обращаться внутри лямбда-выражения запрещено.
Как отсортировать список строк с помощью лямбда-выражения?
public static List<String> sort(List<String> list){
Collections.sort(list, (a, b) -> a.compareTo(b));
return list;
}
👉
👩💻 Зачем Java-разработчикам Redis?
Узнайте на открытом практическом уроке от OTUS, где мы:
- посмотрим, как в Java-приложениях можно использовать Redis в качестве in-memory кеша;
- увидим, для чего это может быть полезно и какие задачи можно решить;
- ответим на все возникающие вопросы.
Спикер Сергей Петрелевич — опытный Java/Kotlin-разработчик, Oracle Certified Professional, Java SE 8 Programmer.
Встречаемся 25 июня в 20:00 мск в рамках курса «Java Developer. Professional».
Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cxJfdq
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Узнайте на открытом практическом уроке от OTUS, где мы:
- посмотрим, как в Java-приложениях можно использовать Redis в качестве in-memory кеша;
- увидим, для чего это может быть полезно и какие задачи можно решить;
- ответим на все возникающие вопросы.
Спикер Сергей Петрелевич — опытный Java/Kotlin-разработчик, Oracle Certified Professional, Java SE 8 Programmer.
Встречаемся 25 июня в 20:00 мск в рамках курса «Java Developer. Professional».
Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cxJfdq
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как применяют технологию SPI
Service Provider Interface – технология из стандартной поставки JavaSE. Этой технологией реализуется IoC, не являющаяся при этом DI. С помощью SPI можно легко и без дополнительных инструментов поставлять конкретные реализации сервисов отдельными jar-файлами. Применение обычно похоже на механизм плагинов.
Два основных понятия SPI – это service и service provider. Service – интерфейс или абстрактный класс, который объявляет API требуемого сервиса, и предоставляется основным приложением. Service provider – реализация этого API, наследник класса/интерфейса сервиса, который динамически поставляется в основное приложение библиотекой-плагином. Для одного сервиса может быть предоставлено несколько провайдеров из одной или нескольких библиотек.
На интерфейс сервиса не накладывается никаких ограничений. Провайдер же обязан реализовывать этот интерфейс, и иметь конструктор без параметров. Внутри jar-файла в директории META-INF/services лежат текстовые файлы, где имя файла – полное имя сервиса, а его строчки – полные имена провайдеров этого сервиса, которые поставляются этой библиотекой.
Для получения провайдеров всех библиотек приложения используется класс ServiceLoader. Это итератор по сервис-провайдерам, а создается он статическим методом load, в который параметром передается интерфейс/абстрактный класс интересующего сервиса.
Доступ к файлам-ресурсам из classpath обеспечивается загрузчиком классов, поэтому дополнительно при загрузке можно указать специфический загрузчик. С появлением модульности в Java 9 можно также указать модуль.
SPI повсеместно используется в стандартной библиотеке JDK. С его помощью подключаются JDBC-драйверы. Через ServiceLoader также загружаются таймзоны, системные настройки, кодировки, провайдеры файловой системы и многое другое.
👉
Service Provider Interface – технология из стандартной поставки JavaSE. Этой технологией реализуется IoC, не являющаяся при этом DI. С помощью SPI можно легко и без дополнительных инструментов поставлять конкретные реализации сервисов отдельными jar-файлами. Применение обычно похоже на механизм плагинов.
Два основных понятия SPI – это service и service provider. Service – интерфейс или абстрактный класс, который объявляет API требуемого сервиса, и предоставляется основным приложением. Service provider – реализация этого API, наследник класса/интерфейса сервиса, который динамически поставляется в основное приложение библиотекой-плагином. Для одного сервиса может быть предоставлено несколько провайдеров из одной или нескольких библиотек.
На интерфейс сервиса не накладывается никаких ограничений. Провайдер же обязан реализовывать этот интерфейс, и иметь конструктор без параметров. Внутри jar-файла в директории META-INF/services лежат текстовые файлы, где имя файла – полное имя сервиса, а его строчки – полные имена провайдеров этого сервиса, которые поставляются этой библиотекой.
Для получения провайдеров всех библиотек приложения используется класс ServiceLoader. Это итератор по сервис-провайдерам, а создается он статическим методом load, в который параметром передается интерфейс/абстрактный класс интересующего сервиса.
Доступ к файлам-ресурсам из classpath обеспечивается загрузчиком классов, поэтому дополнительно при загрузке можно указать специфический загрузчик. С появлением модульности в Java 9 можно также указать модуль.
SPI повсеместно используется в стандартной библиотеке JDK. С его помощью подключаются JDBC-драйверы. Через ServiceLoader также загружаются таймзоны, системные настройки, кодировки, провайдеры файловой системы и многое другое.
👉
Какие виды ссылок на методы вы знаете?
⚫️на статический метод;
⚫️на метод экземпляра;
⚫️на конструктор.
👉
⚫️на статический метод;
⚫️на метод экземпляра;
⚫️на конструктор.
👉
Как разобраться в вышмате за 1 вечер? 😨
Да никак. Но можно научиться понимать математику. И сберечь месяцы жизни, кучу нервов и сил.
В помощь вам - полезный канал о высшей математике. Его автор - выпускник СПБГУ, а ныне — преподаватель предмета.
На простом языке объясняет сложные вещи, даёт шпаргалки и проводит эфиры с решением задач 📈
Находка для всех, кому нужен вышмат по жизни. От полезных материалов и разборов до ответов на любые вопросы и живых дискуссий в комментариях.
Посмотрите сами 👉
Да никак. Но можно научиться понимать математику. И сберечь месяцы жизни, кучу нервов и сил.
В помощь вам - полезный канал о высшей математике. Его автор - выпускник СПБГУ, а ныне — преподаватель предмета.
На простом языке объясняет сложные вещи, даёт шпаргалки и проводит эфиры с решением задач 📈
Находка для всех, кому нужен вышмат по жизни. От полезных материалов и разборов до ответов на любые вопросы и живых дискуссий в комментариях.
Посмотрите сами 👉
Что такое «функциональные интерфейсы»?
Функциональный интерфейс - это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация , работающая по принципу . Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default методов и при этом оставаться функциональным, потому что default методы - не абстрактные.
👉
Функциональный интерфейс - это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация , работающая по принципу . Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default методов и при этом оставаться функциональным, потому что default методы - не абстрактные.
👉
Для чего нужны функциональные интерфейсы Function<T,R>, DoubleFunction<R>, IntFunction<R> и LongFunction<R>?
Function<T, R> - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса
Методы по умолчанию могут использоваться для построения цепочек вызовов (
⚫️DoubleFunction<R> - функция получающая на вход Double и возвращающая на выходе экземпляр класса R;
⚫️IntFunction<R> - функция получающая на вход Integer и возвращающая на выходе экземпляр класса R;
⚫️LongFunction<R> - функция получающая на вход Long и возвращающая на выходе экземпляр класса R.
👉
Function<T, R> - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса
T
и возвращающая на выходе экземпляр класса R
.Методы по умолчанию могут использоваться для построения цепочек вызовов (
compose
, andThen
).Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
⚫️DoubleFunction<R> - функция получающая на вход Double и возвращающая на выходе экземпляр класса R;
⚫️IntFunction<R> - функция получающая на вход Integer и возвращающая на выходе экземпляр класса R;
⚫️LongFunction<R> - функция получающая на вход Long и возвращающая на выходе экземпляр класса R.
👉
🚀 От новичка до Middle+ в Java-разработке под руководством лучших экспертов ниши!
Актуальное обучение для всех, кто хочет стать Java-разработчиком с нуля и для тех, кто еще не определился с языком программирования.
📌После онлайн-курса «Специализация Java-разработчик» от OTUS вы сможете:
- создавать современные приложения на Java;
- работать с реляционными базами данных;
- разрабатывать серверные веб-приложения;
- претендовать на позиции Middle Java Developer.
Вы освоите самые востребованные инструменты и лучшие практики.
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще сильные проекты для портфолио и карьерный сапорт!
🎁 Успей на курс! Только до 23 июня скидка 10%, подробности у наших менеджеров - просто оставь заявку.
Старт уже 28 июня.
👉 Изучите подробности и оставьте заявку, чтобы получить специальную цену на курс: https://vk.cc/cxMyWB
Актуальное обучение для всех, кто хочет стать Java-разработчиком с нуля и для тех, кто еще не определился с языком программирования.
📌После онлайн-курса «Специализация Java-разработчик» от OTUS вы сможете:
- создавать современные приложения на Java;
- работать с реляционными базами данных;
- разрабатывать серверные веб-приложения;
- претендовать на позиции Middle Java Developer.
Вы освоите самые востребованные инструменты и лучшие практики.
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще сильные проекты для портфолио и карьерный сапорт!
🎁 Успей на курс! Только до 23 июня скидка 10%, подробности у наших менеджеров - просто оставь заявку.
Старт уже 28 июня.
👉 Изучите подробности и оставьте заявку, чтобы получить специальную цену на курс: https://vk.cc/cxMyWB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Что делает семафор?
Семафор – один из старейших примитивов синхронизации. Он был изобретен Дейкстрой в 1968 году. По большому счету это счетчик, который можно увеличивать и уменьшать из разных потоков. Уменьшение до 0 блокирует уменьшающий поток. Состояние, когда счетчик больше нуля называют сигнальное состояние, операцию его увеличения – release (освобождение) или signal, уменьшения – acquire (захват) или wait.
На практике можно представить, что release – выделение квоты доступа к критической секции программы. acquire – использование необходимого объема доступной квоты, или ожидание, если её не хватает.
В Java семафор реализован классом Semaphore. Состоит этот класс в основном из разных форм методов acquire (с таймаутом, с игнорированием InterruptedException, неблокирующий) и release. Методы могут принимать параметр permits – тот самый объем квот, которые необходимо освободить/захватить.
Несколько вспомогательных методов позволяют узнать больше о количестве и составе очереди потоков, которые ждут освобождения пермитов. А методы availablePermits и drainPermits позволяют узнать количество оставшихся пермитов, и захватить их все соответственно. В конструкторе конфигурируются изначальное количество пермитов, и свойство fair (аналогичное свойству ReentrantLock).
👉
Семафор – один из старейших примитивов синхронизации. Он был изобретен Дейкстрой в 1968 году. По большому счету это счетчик, который можно увеличивать и уменьшать из разных потоков. Уменьшение до 0 блокирует уменьшающий поток. Состояние, когда счетчик больше нуля называют сигнальное состояние, операцию его увеличения – release (освобождение) или signal, уменьшения – acquire (захват) или wait.
На практике можно представить, что release – выделение квоты доступа к критической секции программы. acquire – использование необходимого объема доступной квоты, или ожидание, если её не хватает.
В Java семафор реализован классом Semaphore. Состоит этот класс в основном из разных форм методов acquire (с таймаутом, с игнорированием InterruptedException, неблокирующий) и release. Методы могут принимать параметр permits – тот самый объем квот, которые необходимо освободить/захватить.
Несколько вспомогательных методов позволяют узнать больше о количестве и составе очереди потоков, которые ждут освобождения пермитов. А методы availablePermits и drainPermits позволяют узнать количество оставшихся пермитов, и захватить их все соответственно. В конструкторе конфигурируются изначальное количество пермитов, и свойство fair (аналогичное свойству ReentrantLock).
👉