Что такое функциональный интерфейс?
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса
Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией
Типичные примеры функциональных интерфейсов:
👉@BookJava
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса
Object
также игнорируется.Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией
@FunctionalInterface
. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции.Типичные примеры функциональных интерфейсов:
Callable, Supplier, Comparable.
👉@BookJava
👍6
Какие некоторые из важных особенностей и преимуществ Spring Framework?
Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.
Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:
• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
• Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
• Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.
👉@BookJava
Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.
Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:
• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
• Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
• Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.
👉@BookJava
👍6
Java Exception Handling Cheat Sheet
https://javaconceptoftheday.com/java-exception-handling-cheat-sheet/
👉@BookJava
https://javaconceptoftheday.com/java-exception-handling-cheat-sheet/
👉@BookJava
👍2😁1
Как инициализировать переменную функционального интерфейса?
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором
Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
2. Ссылка на метод:
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором
new
. Можно совместить эти два действия, и создать экземпляр анонимного класса.Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
(x, y) -> x * y
2. Ссылка на метод:
Math::sqrt
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
👍6
Какие подклассы класса Reader вы знаете, для чего они предназначены?
👉@BookJava
• Reader
- абстрактный класс, описывающий символьный ввод;• BufferedReader
- буферизованный входной символьный поток;• CharArrayReader
- входной поток, который читает из символьного массива;• FileReader
- входной поток, читающий файл;• FilterReader
- абстрактный класс, предоставляющий интерфейс для классов-надстроек;• InputStreamReader
- входной поток, транслирующий байты в символы;• LineNumberReader
- входной поток, подсчитывающий строки;• PipedReader
- входной канал;• PushbackReader
- входной поток, позволяющий возвращать символы обратно в поток;• StringReader
- входной поток, читающий из строки.👉@BookJava
👍9
Продвинутый Java (от разработчика из JetBrains)
Java. Урок 1. Обзор Java. Лекции от Senior Java-разработчика из JetBrains
Java. Урок 2. Javadoc и наследование
Java. Урок 3. Исключения и обобщенные типы в Java
Java. Урок 4. Коллекции Java и Stream API
Java. Урок 5. Многопоточность. Часть 1
👉@BookJava
Java. Урок 1. Обзор Java. Лекции от Senior Java-разработчика из JetBrains
Java. Урок 2. Javadoc и наследование
Java. Урок 3. Исключения и обобщенные типы в Java
Java. Урок 4. Коллекции Java и Stream API
Java. Урок 5. Многопоточность. Часть 1
👉@BookJava
👍9
AssertJ как способ значительно улучшить код ваших тестов
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как более «модное и молодёжное» решение, но поддержки эта идея не получила. Я был одним из тех, кто выступал против AssertJ. Каюсь, был грешен :)
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
https://habr.com/ru/post/675778/
👉@BookJava
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как более «модное и молодёжное» решение, но поддержки эта идея не получила. Я был одним из тех, кто выступал против AssertJ. Каюсь, был грешен :)
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
https://habr.com/ru/post/675778/
👉@BookJava
Хабр
AssertJ как способ значительно улучшить код ваших тестов
Привет, Хабр! В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более...
👍3
Что можно импортировать статически?
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
👉@BookJava
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
static import
обязана располагаться там же, где и обычные импорты – обязательно между package
и объявлением основного класса файла.👉@BookJava
👍2
Нельзя так просто взять и вычислить абсолютное значение
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
public static double abs(double value) {
if (value < 0) {
return -value;
}
return value;
}
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
👍12
Как использовать ReadWriteLock?
Стандартный интерфейс
Оба типа блокировок одного экземпляра
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
👉@BookJava
Стандартный интерфейс
ReadWriteLock
предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock()
и writeLock()
. Они возвращают объекты под интерфейсом Lock.Оба типа блокировок одного экземпляра
ReadWriteLock
связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock
закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock
осуществляется модификация ресурса.Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
ReentrantReadWriteLock
, который во многом похож на обычный ReentrantLock.👉@BookJava
👍4
Сравнение виртуальных и обычных потоков в Java
Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом.
https://habr.com/ru/post/676084/
👉@BookJava
Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом.
https://habr.com/ru/post/676084/
👉@BookJava
👍3👎1
Media is too big
VIEW IN TELEGRAM
Фантастические баги и где они обитают
Интерактивный мастер-класс по Java, на котором Юрий Пеньков, senior java-разработчик, рассказал о хитростях написания кода, неожиданных результатах выполнения, объяснил на примерах неочевидные моменты языка.
👉@BookJava
Интерактивный мастер-класс по Java, на котором Юрий Пеньков, senior java-разработчик, рассказал о хитростях написания кода, неожиданных результатах выполнения, объяснил на примерах неочевидные моменты языка.
👉@BookJava
👍4
Перечислите стандартные функциональные интерфейсы
Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:
Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).
Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.
Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.
Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.
Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👉@BookJava
Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:
Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).
Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.
Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.
Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.
Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👉@BookJava