Регулярные выражения в Java
В Java регулярные выражения или Regex (сокращенно), можно использовать для поиска, манипулирования и редактирования строк в Java. Проверка электронной почты и паролей - вот несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения в Java представлены в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса. Пакет java.util.regex в основном состоит из следующих трех классов, как показано ниже в табличной форме:
Pattern Class
Matcher Class
PatternSyntaxException Class
MatchResult Interface
https://www.geeksforgeeks.org/regular-expressions-in-java/
👉@BookJava
В Java регулярные выражения или Regex (сокращенно), можно использовать для поиска, манипулирования и редактирования строк в Java. Проверка электронной почты и паролей - вот несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения в Java представлены в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса. Пакет java.util.regex в основном состоит из следующих трех классов, как показано ниже в табличной форме:
Pattern Class
Matcher Class
PatternSyntaxException Class
MatchResult Interface
https://www.geeksforgeeks.org/regular-expressions-in-java/
👉@BookJava
👍4
В Java 21 появилось множество новых функций и методов, которые помогут нам писать код более качественно. Но их легко не заметить или пропустить их использование, поскольку это относительно новая версия.
https://foojay.io/today/ensuring-the-right-usage-of-java-21-new-features/
👉@BookJava
https://foojay.io/today/ensuring-the-right-usage-of-java-21-new-features/
👉@BookJava
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Если у вас есть конфликты при мерже, не волнуйтесь!
Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips
👉@BookJava
Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips
👉@BookJava
👍4
Когда используется StampedLock?
Во-первых, если блокировка
В
Не смотря на похожесть,
Итого, блокировка на штампах решает те же задачи, что
👉@BookJava
StampedLock
– примитив синхронизации, добавленный в Java с версии 8. Общий принцип его работы точно такой же, как у ReadWriteLock: захват неэксклюзивной блокировки (на чтение), и эксклюзивной (на запись). Но есть у этих классов ряд различий в деталях.Во-первых, если блокировка
ReadWriteLock
возвращает объекты типа Lock, то StampedLock
возвращает числа типа long
, которые и называется «штампами». Штамп служит идентификатором лока, он передается параметром в методы по работе с ранее захваченной блокировкой чтения или записи. Специальный штамп 0 означает неудавшийся захват.StampedLock
в отличие от ReentrantReadWriteLock – не реентрант. Это накладывает бóльшую ответственность на программиста: можно устроить дедлок на одном потоке.В
StampedLock
расширена функциональность. Новые методы с префиксом try* не висят в ожидании. Методы tryOptimistic* реализуют оптимистичную блокировку. Методы tryConvert* дают возможность изменять «уровень» заблокированности: можно попытаться превратить readLock во writeLock, и наоборот.Не смотря на похожесть,
StampedLock
не наследуется от ReadWriteLock
. Но для совместимости в нём предусмотрены методы-адаптеры asReadWriteLock
, asReadLock
и asWriteLock
.Итого, блокировка на штампах решает те же задачи, что
ReadWriteLock
, но дает больше возможностей и лучшую производительность.👉@BookJava
👍3
Еще раз о перформансе стримов в Java
Время от времени я наблюдаю или даже бываю втянутым в спор о перформансе стримов в джаве. Общеизвестно, что стримы это компромисс между перформансом и удобством. Однако я не нашел вменяемого набора бенчмарков, которые бы показали, насколько именно медленны (или быстры) стримы. Поэтому я решил написать эти бенчмарки сам.
https://medium.com/@daniel.las/speed-of-java-stream-1cc3a94b44c2
👉@BookJava
Время от времени я наблюдаю или даже бываю втянутым в спор о перформансе стримов в джаве. Общеизвестно, что стримы это компромисс между перформансом и удобством. Однако я не нашел вменяемого набора бенчмарков, которые бы показали, насколько именно медленны (или быстры) стримы. Поэтому я решил написать эти бенчмарки сам.
https://medium.com/@daniel.las/speed-of-java-stream-1cc3a94b44c2
👉@BookJava
🤡8👍1
Чего следует избегать при написании Java-кода
Небольшая статья, в которой перечислены ошибки, допускаемые разработчиками при разработке на Java. Мы хотим, чтобы наш код был эффективным и совместимым.
Использование Enum.values
Передача параметров Optional в качестве параметра метода
Использование StringBuilder
https://medium.com/@b.stoilov/things-to-avoid-while-writing-java-cd078e5aa61c
👉@BookJava
Небольшая статья, в которой перечислены ошибки, допускаемые разработчиками при разработке на Java. Мы хотим, чтобы наш код был эффективным и совместимым.
Использование Enum.values
public enum Fruits {
APPLE, PEAR, ORANGE, BANANA;
public static void main(String[] args) {
System.out.println(Fruits.values());
System.out.println(Fruits.values());
}
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Передача параметров Optional в качестве параметра метода
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
return zoneId.stream()
.map(LocalDateTime::now)
.findFirst()
.orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Использование StringBuilder
String longString = "";
longString +="start";
longString +="middle";
longString +="middle";
longString +="middle";
longString +="end";
https://medium.com/@b.stoilov/things-to-avoid-while-writing-java-cd078e5aa61c
👉@BookJava
👍7
Media is too big
VIEW IN TELEGRAM
Пишем рекомендательную систему музыки на Java
Андрей Кузнецов — Мастер-класс
Машинное обучение обычно рассматривают как отдельно стоящую область, требующую специфических знаний. Однако на практике бывает, что для решения бизнес-задач может быть достаточно и простых решений, имплементация которых не представляет сложностей для разработчика.
Используя открытый датасет, мы пишем с нуля на Java рекомендательную систему музыки и разберем, какие из наивных решений могут не сработать в реальных системах. На примере технологий Одноклассников спикер рассказывает, как решаются ML-задачи в гетерогенных продакшенах, где необходимо использовать вместе Java и Python.
Мастер-класс будет интересен разработчикам, которым интересна тема машинного обучения, но они либо еще не погружались в нее, либо сделали самые первые шаги.
источник
👉@BookJava
Андрей Кузнецов — Мастер-класс
Машинное обучение обычно рассматривают как отдельно стоящую область, требующую специфических знаний. Однако на практике бывает, что для решения бизнес-задач может быть достаточно и простых решений, имплементация которых не представляет сложностей для разработчика.
Используя открытый датасет, мы пишем с нуля на Java рекомендательную систему музыки и разберем, какие из наивных решений могут не сработать в реальных системах. На примере технологий Одноклассников спикер рассказывает, как решаются ML-задачи в гетерогенных продакшенах, где необходимо использовать вместе Java и Python.
Мастер-класс будет интересен разработчикам, которым интересна тема машинного обучения, но они либо еще не погружались в нее, либо сделали самые первые шаги.
источник
👉@BookJava
👍7
Как в Java используются final, finally и finalize
В этой статье вы узнаете, где, когда и зачем используется ключевое слово
https://telegra.ph/Kak-v-Java-ispolzuyutsya-final-finally-i-finalize-04-17
👉@BookJava
В этой статье вы узнаете, где, когда и зачем используется ключевое слово
Finalize
, и стоит ли его вообще применять в Java. Также вы узнаете о различиях между final
, finally
и finalize
.https://telegra.ph/Kak-v-Java-ispolzuyutsya-final-finally-i-finalize-04-17
👉@BookJava
Telegraph
Как в Java используются final, finally и finalize
В этой статье вы узнаете, где, когда и зачем используется ключевое слово Finalize, и стоит ли его вообще применять в Java. Также вы узнаете о различиях между final, finally и finalize. Где используется блок finally? Блок finally в Java используется для размещения…
👍2
Как не допустить сериализацию?
Чтобы не допустить автоматическую сериализацию можно переопределить private методы для создания исключительной ситуации NotSerializableException.
👉@BookJava
Чтобы не допустить автоматическую сериализацию можно переопределить private методы для создания исключительной ситуации NotSerializableException.
private void writeObject(ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(ObjectInputStream in) throws IOException {
throw new NotSerializableException();
}
👉@BookJava
👍5
Media is too big
VIEW IN TELEGRAM
Docker и Spring Boot микросервис (Быстрый старт)
Разберем основные понятия докера и запустим spring boot микросервис в докере
00:00 Intro
00:58 Установить докер
02:05 Развитие виртуализации
09:30 Компоненты Docker
11:25 Docker Daemon
11:50 Dockerfile
12:42 Docker Image
13:12 Docker Registry
13:45 Docker Container
14:00 Dockerhub
14:57 Практика. Пишем микросервис
17:30 Практика. Пишем dockerfile
23:25 Практика. Создаем docker образ
25:48 Практика. Запускам docke контейнер
27:19 Практика. Основные команды
30:00 Best practice. Как еще можно написать dockerfile
33:14 Best practice. Рекомендации
35:01 Итог
источник
👉@BookJava
Разберем основные понятия докера и запустим spring boot микросервис в докере
00:00 Intro
00:58 Установить докер
02:05 Развитие виртуализации
09:30 Компоненты Docker
11:25 Docker Daemon
11:50 Dockerfile
12:42 Docker Image
13:12 Docker Registry
13:45 Docker Container
14:00 Dockerhub
14:57 Практика. Пишем микросервис
17:30 Практика. Пишем dockerfile
23:25 Практика. Создаем docker образ
25:48 Практика. Запускам docke контейнер
27:19 Практика. Основные команды
30:00 Best practice. Как еще можно написать dockerfile
33:14 Best practice. Рекомендации
35:01 Итог
источник
👉@BookJava
👍12
Как работают фильтры сервлетов?
Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.
Фильтр состоит из трех методов:
👉@BookJava
Servlet
содержит саму бизнес-логику обработки запросов. Реализации интерфейса javax.servlet.Filter
выстраиваются в цепочку, через которую проходит запрос по пути в сервлет, и ответ на него по пути обратно к пользователю.Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.
Фильтр состоит из трех методов:
init
, doFilter
и destroy
. doFilter – основная реализация фильтрации, он вызывается для каждого запроса. Инициализация и уничтожение вызываются строго по одному разу. Кроме того, сервлет-контейнер гарантирует, что их вызовы не будут пересекаться: doFilter
не начнет работать до конца выполнения init
, и закончит до начала destroy
.👉@BookJava
👍7
Media is too big
VIEW IN TELEGRAM
Kafka Cluster в Docker
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
🔥5👍3
JRE – Java Runtime Environment, Java-окружение времени выполнения. Это набор всего необходимого чтобы запустить скомпилированную Java-программу. Окружение состоит из виртуальной машины Java (JVM), библиотеки классов (Java Class Library), консольной команды java и прочей инфраструктуры. Тем не менее, JRE не достаточно чтобы создавать новые программы.
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
👍3
Какие задачи решает Spring Data?
Это проект, который упрощает работу с системами доступа к данным: реляционными и нереляционными базами данных, map-reduce фреймворками и облачными хранилищами. Центральная концепция проекта – репозитории из предметно-ориентированного дизайна (Domain-driven design, DDD).
Spring Data состоит из множества отдельных библиотек для разных случаев жизни. Вот самые популярные из них:
• Spring Data JPA – адаптер для реализаций Java Persistence API, таких как Hibernate.
• Spring Data JDBC – более простой и ограниченный чем JPA адаптер для JDBC-драйверов.
• Spring Data REST – создание готовых hypermedia-driven RESTful сервисов на основе репозиториев.
• Spring Data KeyValue – работа с хранилищами типа ключ-значение.
• Библиотеки поддержки конкретных реализаций хранилищ: MongoDB, Redis, Cassandra, LDAP, и других.
👉@BookJava
Это проект, который упрощает работу с системами доступа к данным: реляционными и нереляционными базами данных, map-reduce фреймворками и облачными хранилищами. Центральная концепция проекта – репозитории из предметно-ориентированного дизайна (Domain-driven design, DDD).
Spring Data состоит из множества отдельных библиотек для разных случаев жизни. Вот самые популярные из них:
• Spring Data JPA – адаптер для реализаций Java Persistence API, таких как Hibernate.
• Spring Data JDBC – более простой и ограниченный чем JPA адаптер для JDBC-драйверов.
• Spring Data REST – создание готовых hypermedia-driven RESTful сервисов на основе репозиториев.
• Spring Data KeyValue – работа с хранилищами типа ключ-значение.
• Библиотеки поддержки конкретных реализаций хранилищ: MongoDB, Redis, Cassandra, LDAP, и других.
👉@BookJava
👍4
Совет по Java 💡☕️
Как легко просуммировать все числа в Java-списке? Для этого мы можем использовать метод Java Stream
👉@BookJava
Как легко просуммировать все числа в Java-списке? Для этого мы можем использовать метод Java Stream
reduce
👉@BookJava
👍10👎7
Что происходит внутри TreeMap.put()?
Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
TreeMap
требует либо задать порядок ключей вручную (передать в конструктор Comparator
), либо чтобы они имели собственный естественный порядок (были Comparable
).Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
compare
. Дойдя до конца, пара ключ-значение «повисает» новым узлом.2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
👍8
👍3
Перечислите стандартные функциональные интерфейсы
Стандартная библиотека содержит пакет
Функции
Обычная обобщенная функция – интерфейс
Бинарные функции – функции с двумя параметрами и возвращаемым значением.
Поставщики (Suppliers)
Интерфейсы
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T
Предикаты
Операторы
Унарный (
👉@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
👍6