Метод
Optional.or() используется для того, чтобы вернуть значение текущего Optional, если оно присутствует, или вернуть другой Optional, если текущее значение отсутствует. Это удобно, когда нужно подставить запасной вариант, если значение отсутствует (т.е. Optional пуст).Сигнатура метода:
Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Если
Optional содержит значение, or() вернет текущий Optional. Если Optional пуст, он выполнит supplier.get() и вернет результат этого вызова, т.е. другой Optional.Пример:
import java.util.Optional;
public class OptionalOrExample {
public static void main(String[] args) {
Optional<String> optionalValue = Optional.of("Hello");
// Если optionalValue пуст, вернем запасное значение
String result = optionalValue
.or(() -> Optional.of("Default Value"))
.get();
System.out.println(result); // Выведет "Hello", так как optionalValue не пуст
}
}
Если заменить
Optional.of("Hello") на Optional.empty(), тогда or() вернет запасное значение "Default Value".#java #Optional #or
Please open Telegram to view this post
VIEW IN TELEGRAM
👎6❤2🤝1
Класс, помеченный модификатором
abstract, называется абстрактным и может служить только в качестве родительского для других классов. Создавать объекты самого абстрактного класса нельзя. При этом наследовать абстрактный класс могут как другие абстрактные классы, так и обычные классы, допускающие создание экземпляров.Метод, обозначенный ключевым словом
abstract, называется абстрактным методом и не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.Абстрактные классы и методы позволяют создать шаблон объекта, который необходимо реализовать в дочерних классах. В самих же абстрактных классах задаётся только общее поведение для всех наследников.
#java #abstract
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3
Интерфейс (
interface) — это специальный тип, который содержит только абстрактные методы (до Java 8) и константы. Интерфейсы служат для задания контракта, который классы обязаны реализовать, если они его используют. В интерфейсе нельзя создать реализацию методов (до Java 8), и все методы по умолчанию являются public и abstract.С версии Java 8 в интерфейсах можно использовать методы с реализацией (
default и static), а с версии Java 9 — private методы. Интерфейсы позволяют реализовать множественное наследование, поскольку класс может реализовать несколько интерфейсов.#java #interface
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2🤯1
В Java с версии 9 появилась возможность использовать
private методы в интерфейсах. Эти методы предназначены для улучшения внутренней организации интерфейсов, позволяя избежать дублирования кода в default и static методах. private методы помогают реализовать общую логику, к которой могут обращаться другие методы интерфейса, но они остаются недоступными для классов, реализующих интерфейс.private методы могут быть как экземплярными, так и static.Пример:
public interface MyInterface {
default void showMessage() {
print("Default method calling private method");
}
static void showStaticMessage() {
print("Static method calling private method");
}
// Private method for reuse
private static void print(String message) {
System.out.println(message);
}
}
#java #interface #private
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍2🔥1
Метод equals() используется для сравнения двух объектов на равенство. Он определен в классе
Контракт equals
При переопределении метода
Рефлексивность
для любого заданного значения x, выражение
Заданного — такого, что
Симметричность
для любых заданных значений x и y,
Транзитивность
для любых заданных значений x, y и z, если
Согласованность
для любых заданных значений x и y повторный вызов
Сравнение null
для любого заданного значения x вызов
Object и, по умолчанию, выполняет сравнение ссылок на объекты (то есть проверяет, являются ли объекты одним и тем же объектом в памяти). Многие классы переопределяют этот метод, чтобы сравнивать содержимое объектов, а не только ссылки.Контракт equals
При переопределении метода
equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java.Рефлексивность
для любого заданного значения x, выражение
x.equals(x) должно возвращать true.Заданного — такого, что
x != nullСимметричность
для любых заданных значений x и y,
x.equals(y) должно возвращать true только в том случае, когда y.equals(x) возвращает true.Транзитивность
для любых заданных значений x, y и z, если
x.equals(y) возвращает true и y.equals(z) возвращает true, x.equals(z) должно вернуть значение true.Согласованность
для любых заданных значений x и y повторный вызов
x.equals(y) будет возвращать значение предыдущего вызова этого метода при условии, что поля, используемые для сравнения этих двух объектов, не изменялись между вызовами.Сравнение null
для любого заданного значения x вызов
x.equals(null) должен возвращать false.❤8🤝2🔥1
❤9🎉2
enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}
public class Quest {
public static void main(String[] args) {
Month m = Month.JANUARY;
String season = switch (m) {
case DECEMBER, JANUARY, FEBRUARY -> "Winter";
case MARCH, APRIL, MAY -> "Spring";
case JUNE, JULY, AUGUST -> "Summer";
case SEPTEMBER, OCTOBER -> "Autumn";
};
System.out.println(season);
}
}#java #quest
❤8👎1
🎉6
В Java 12 появился новый синтаксис для
switch, который позволяет возвращать значение используя стрелки ->, что делает код более компактным и удобным. Теперь switch может использоваться как выражение, а не только как оператор, что упрощает его применение в логике.Ранее
switch использовался как оператор, и код мог выглядеть громоздко:
String day = "MONDAY";
int numLetters;
switch (day) {
case "MONDAY":
case "FRIDAY":
case "SUNDAY":
numLetters = 6;
break;
case "TUESDAY":
numLetters = 7;
break;
default:
numLetters = 8;
}
System.out.println(numLetters); // Вывод: 6
Со Switch Expressions можно переписать этот код более лаконично:
String day = "MONDAY";
int numLetters = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
default -> 8;
};
System.out.println(numLetters); // Вывод: 6
Теперь
switch может вернуть значение, и нет необходимости в break.#java #switch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25😨3❤1🔥1
ВЕБ-СКРАПИНГ
Веб-скрапинг — это процесс автоматизированного извлечения данных с веб-сайтов. Этот подход позволяет собирать информацию с различных источников, включая новости, отзывы, цены и другие публичные данные. Такого рода практики помогают исследователям, аналитикам и разработчикам анализировать большие объемы информации и использовать ее для разных целей.
Зачем нужен веб-скрапинг?
✔️ Сбор данных: Автоматизированный процесс помогает избежать рутинной работы и значительно экономит время.
✔️ Анализ конкурентов: С помощью скрапа можно отслеживать изменения на сайте конкурентов, выяснять стратегии ценообразования и проводить анализ тенденций.
✔️ Полезные приложения: Создание приложений для мониторинга цен, агрегаторов новостей и других сервисов, использующих живую информацию.
И, главное, помните про соблюдение правил: перед скрапингом сайта обязательно ознакомьтесь с его robots.txt — файлом, который указывает, какие страницы можно скрапить, а какие — нет.
Веб-скрапинг — это процесс автоматизированного извлечения данных с веб-сайтов. Этот подход позволяет собирать информацию с различных источников, включая новости, отзывы, цены и другие публичные данные. Такого рода практики помогают исследователям, аналитикам и разработчикам анализировать большие объемы информации и использовать ее для разных целей.
Зачем нужен веб-скрапинг?
✔️ Сбор данных: Автоматизированный процесс помогает избежать рутинной работы и значительно экономит время.
✔️ Анализ конкурентов: С помощью скрапа можно отслеживать изменения на сайте конкурентов, выяснять стратегии ценообразования и проводить анализ тенденций.
✔️ Полезные приложения: Создание приложений для мониторинга цен, агрегаторов новостей и других сервисов, использующих живую информацию.
И, главное, помните про соблюдение правил: перед скрапингом сайта обязательно ознакомьтесь с его robots.txt — файлом, который указывает, какие страницы можно скрапить, а какие — нет.
👍9❤2
Теперь давайте рассмотрим, как создать простой веб-скрапер, используя библиотеку Jsoup. Это мощный инструмент для работы с HTML, который позволяет удобно извлекать нужные данные.
Чтобы начать, добавьте зависимость Jsoup в ваш проект. Если вы используете Maven, добавьте следующий фрагмент в ваш pom.xml:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version> <!-- Убедитесь, что используете последнюю версию -->
</dependency>
Мы создадим простой веб-скрапер, который будет извлекать заголовки с сайта новостей.
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class NewsScraper {
public static void main(String[] args) {
String url = "https://example-news-site.com"; // Замените на реальный URL
try {
// Загружаем документ
Document doc = Jsoup.connect(url).get();
// Извлекаем элементы (например, заголовки новостей)
Elements newsHeadlines = doc.select(".headline"); // CSS-селектор для заголовков
// Обрабатываем и выводим заголовки
for (Element headline : newsHeadlines) {
System.out.println(headline.text()); // Выводим текст заголовка
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Что происходит в коде?
1️⃣ Подключение к веб-странице: Метод Jsoup.connect(url).get() позволяет загрузить HTML-код страницы.
2️⃣ Извлечение данных: Метод select() позволяет отобрать элементы, соответствующие заданному CSS-селектору (в нашем случае заголовкам новостей с классом .headline).
3️⃣ Вывод результатов: Перебирая элементы, выводим текст заголовков в консоль.
#java #Jsoup
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3
Singleton — это паттерн проектирования, который обеспечивает создание единственного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру. Он часто используется в ситуациях, где нужен строгий контроль над созданием объекта, например, в менеджерах ресурсов или конфигурациях приложения.Реализации паттерна Singleton:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
// Приватный конструктор
}
public static Singleton getInstance() {
if (instance == null) { // Проверка на null для улучшения производительности
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Использование:
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
}
#java #Singleton
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2
Непрерывная интеграция (Continuous Integration, CI) - процесс, при котором разработчики регулярно интегрируют изменения в код, что позволяет автоматически проверять, компилировать и тестировать его.
Непрерывная доставка (Continuous Delivery, CD) - автоматизация процесса развертывания, которая позволяет разработчикам выпускать новое программное обеспечение в продакшн быстро и надежно.
Инструменты для CI/CD
Для Java-проектов существует множество инструментов для настройки CI/CD. Вот несколько популярных:
✔️ Jenkins: Один из самых популярных инструментов для автоматизации сборки и развертывания.
✔️ GitLab CI/CD: Встроенный CI/CD инструмент в GitLab, удобный для использования.
✔️ Travis CI: Простой в использовании CI-сервис, интегрируемый с GitHub.
✔️ CircleCI: Облачный CI/CD сервис, который позволяет легко автоматизировать тестирование и развертывание.
#java #ci #cd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Java-приложение в Docker
В современном мире разработки программного обеспечения Docker становится важным инструментом, помогающим разрабатывать, тестировать и развертывать приложения в изолированной среде. Использование Docker с Java-приложениями позволяет значительно упростить процесс развертывания, гарантируя, что ваше приложение будет работать одинаково на всех средах.
Docker — это платформа для создания, развертывания и управления контейнерами. Контейнеры изолируют приложения и все их зависимости, что делает возможным запуск кода в любом окружении без конфликта с другими приложениями.
Шаг 1: Установка Docker
Перед тем как начать, убедитесь, что Docker установлен на вашем компьютере. Вы можете следовать [официальной документации](https://docs.docker.com/get-docker/) для установки на вашу операционную систему.
Шаг 2: Создание Java-приложения
Для примера создадим простое приложение. Предположим, у вас есть простая программа, которая выводит "Hello, World!".
Создайте файл
Скомпилируйте её с помощью:
Шаг 3: Создание Dockerfile
Dockerfile — это текстовый файл, позволяющий автоматически собирать образ Docker. Создайте файл с именем
Шаг 4: Сборка Docker-образа
Теперь создайте Docker-образ, используя следующую команду в каталоге вашего проекта:
Эта команда соберет образ и назовет его
Шаг 5: Запуск контейнера
Чтобы запустить контейнер, выполните команду:
Вы должны увидеть вывод:
Флаг
#java #docker
В современном мире разработки программного обеспечения Docker становится важным инструментом, помогающим разрабатывать, тестировать и развертывать приложения в изолированной среде. Использование Docker с Java-приложениями позволяет значительно упростить процесс развертывания, гарантируя, что ваше приложение будет работать одинаково на всех средах.
Docker — это платформа для создания, развертывания и управления контейнерами. Контейнеры изолируют приложения и все их зависимости, что делает возможным запуск кода в любом окружении без конфликта с другими приложениями.
Шаг 1: Установка Docker
Перед тем как начать, убедитесь, что Docker установлен на вашем компьютере. Вы можете следовать [официальной документации](https://docs.docker.com/get-docker/) для установки на вашу операционную систему.
Шаг 2: Создание Java-приложения
Для примера создадим простое приложение. Предположим, у вас есть простая программа, которая выводит "Hello, World!".
Создайте файл
HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Скомпилируйте её с помощью:
javac HelloWorld.java
Шаг 3: Создание Dockerfile
Dockerfile — это текстовый файл, позволяющий автоматически собирать образ Docker. Создайте файл с именем
Dockerfile в каталоге вашего проекта:
# Используем официальный образ OpenJDK
FROM openjdk:17-jdk-slim
# Устанавливаем рабочий каталог
WORKDIR /app
# Копируем скомпилированный класс в контейнер
COPY HelloWorld.class ./
# Определяем команду запуска
CMD ["java", "HelloWorld"]
Шаг 4: Сборка Docker-образа
Теперь создайте Docker-образ, используя следующую команду в каталоге вашего проекта:
docker build -t helloworld .
Эта команда соберет образ и назовет его
helloworld.Шаг 5: Запуск контейнера
Чтобы запустить контейнер, выполните команду:
docker run --rm helloworld
Вы должны увидеть вывод:
Hello, World!
Флаг
--rm автоматически удаляет контейнер после его остановки.#java #docker
👍14❤4🔥2
🔧 Maven vs Gradle: Как выбрать систему сборки для вашего проекта?
В мире Java-разработки выбор системы сборки может стать настоящим камнем преткновения. Maven и Gradle — две самые популярные системы, каждая из которых имеет свои сильные и слабые стороны. Давайте рассмотрим их подробнее!
☕ Maven: Стандарт и стабильность
Maven — это зрелая система сборки, основанная на концепции "конвенций над конфигурацией". Она использует XML для описания проекта и его зависимостей.
Плюсы:
- Простота: Понятный и распространенный подход к конфигурации.
- Сообщество: Огромная база плагинов и поддержка сообщества.
- Лучшие практики: Сразу настраивает структуру проекта, следуя лучшим практикам.
Минусы:
- XML-формат: Может стать громоздким и трудным для чтения.
- Медленнее: Процесс сборки может занимать больше времени при больших проектах.
Пример pom.xml:
⚡ Gradle: Гибкость и скорость
Gradle — современная система сборки, которая позволяет использовать Groovy или Kotlin DSL для определения конфигураций. Она обеспечивает большую гибкость и возможность настройки.
Плюсы:
- Производительность: Инкрементальная сборка и кеширование значительно ускоряют процесс.
- Гибкость: Легкость в настройке и использование скриптового языка для кастомизации.
- Модульность: Удобно работать с многоуровневыми проектами.
Минусы:
- Крутая кривая обучения: Меньше "из коробки", чем Maven; требуется больше усилий для освоения.
- Младше: Меньшая база плагинов по сравнению с Maven (хотя ситуация улучшается).
Пример build.gradle:
🤔 Как выбрать?
1️⃣ Масштаб проекта: Для небольших и средних проектов может быть достаточно Maven. Для крупных и сложных проектов Gradle предложит больше возможностей.
2️⃣ Командные предпочтения: Если ваша команда знакома с одной из систем, лучше следовать этому пути.
3️⃣ Будущее проекта: Gradle, как современная система, может предложить более высокую производительность и гибкость для долгосрочных проектов.
🔥 Итог: Оба инструмента могут быть мощными союзниками. Выбор зависит от ваших потребностей и предпочтений команды. Удачи в разработке! 🚀
#Java #Maven #Gradle #BuildSystems
В мире Java-разработки выбор системы сборки может стать настоящим камнем преткновения. Maven и Gradle — две самые популярные системы, каждая из которых имеет свои сильные и слабые стороны. Давайте рассмотрим их подробнее!
☕ Maven: Стандарт и стабильность
Maven — это зрелая система сборки, основанная на концепции "конвенций над конфигурацией". Она использует XML для описания проекта и его зависимостей.
Плюсы:
- Простота: Понятный и распространенный подход к конфигурации.
- Сообщество: Огромная база плагинов и поддержка сообщества.
- Лучшие практики: Сразу настраивает структуру проекта, следуя лучшим практикам.
Минусы:
- XML-формат: Может стать громоздким и трудным для чтения.
- Медленнее: Процесс сборки может занимать больше времени при больших проектах.
Пример pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
</project>
⚡ Gradle: Гибкость и скорость
Gradle — современная система сборки, которая позволяет использовать Groovy или Kotlin DSL для определения конфигураций. Она обеспечивает большую гибкость и возможность настройки.
Плюсы:
- Производительность: Инкрементальная сборка и кеширование значительно ускоряют процесс.
- Гибкость: Легкость в настройке и использование скриптового языка для кастомизации.
- Модульность: Удобно работать с многоуровневыми проектами.
Минусы:
- Крутая кривая обучения: Меньше "из коробки", чем Maven; требуется больше усилий для освоения.
- Младше: Меньшая база плагинов по сравнению с Maven (хотя ситуация улучшается).
Пример build.gradle:
plugins {
id 'java'
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework:spring-context:5.3.8'
}
🤔 Как выбрать?
1️⃣ Масштаб проекта: Для небольших и средних проектов может быть достаточно Maven. Для крупных и сложных проектов Gradle предложит больше возможностей.
2️⃣ Командные предпочтения: Если ваша команда знакома с одной из систем, лучше следовать этому пути.
3️⃣ Будущее проекта: Gradle, как современная система, может предложить более высокую производительность и гибкость для долгосрочных проектов.
🔥 Итог: Оба инструмента могут быть мощными союзниками. Выбор зависит от ваших потребностей и предпочтений команды. Удачи в разработке! 🚀
#Java #Maven #Gradle #BuildSystems
👍11❤5🔥2🗿1
🔒 Spring Security: Обеспечение безопасности веб-приложений
В современном мире веб-разработки безопасность приложений стоит на первом плане, и именно здесь на сцену выходит Spring Security. Это мощный механизм аутентификации и авторизации, который не только защищает ваше приложение, но и делает его более гибким и устойчивым к угрозам. Давайте разберемся, что именно он предлагает и почему стоит его использовать!
🌟 Что такое Spring Security?
Spring Security — это фреймворк, интегрированный в экосистему Spring, который обеспечивает защиту ваших приложений на всех уровнях. Это не просто защита от несанкционированного доступа; это полноценное решение, включающее аутентификацию, авторизацию, защиту от CSRF-атак и многое другое.
🔑 Ключевые особенности:
1. Аутентификация и авторизация: Легко настраивайте различные механизмы аутентификации (Basic Auth, JWT, OAuth2) и определяйте права доступа для разных ролей пользователя!
2. Защита от CSRF и XSS атак: Spring Security автоматически включает защиту от этих распространенных уязвимостей, позволяя вам сосредоточиться на разработке.
3. Интеграция с различными API: Работает с OAuth2 и OpenID Connect, что позволяет интегрироваться с внешними провайдерами аутентификации, такими как Google или Facebook.
4. Настраиваемая конфигурация: Вы имеете полный контроль над механизмами аутентификации и авторизации, создавая настраиваемые правила доступа.
🛠 Как начать?
- Добавьте Spring Security в ваш проект через Maven или Gradle.
- Настройте механизм аутентификации, указав его в конфигурационных файлах.
- Определите правила доступа для различных URL в вашем приложении.
#Java #SpringSecurity #Security
В современном мире веб-разработки безопасность приложений стоит на первом плане, и именно здесь на сцену выходит Spring Security. Это мощный механизм аутентификации и авторизации, который не только защищает ваше приложение, но и делает его более гибким и устойчивым к угрозам. Давайте разберемся, что именно он предлагает и почему стоит его использовать!
🌟 Что такое Spring Security?
Spring Security — это фреймворк, интегрированный в экосистему Spring, который обеспечивает защиту ваших приложений на всех уровнях. Это не просто защита от несанкционированного доступа; это полноценное решение, включающее аутентификацию, авторизацию, защиту от CSRF-атак и многое другое.
🔑 Ключевые особенности:
1. Аутентификация и авторизация: Легко настраивайте различные механизмы аутентификации (Basic Auth, JWT, OAuth2) и определяйте права доступа для разных ролей пользователя!
2. Защита от CSRF и XSS атак: Spring Security автоматически включает защиту от этих распространенных уязвимостей, позволяя вам сосредоточиться на разработке.
3. Интеграция с различными API: Работает с OAuth2 и OpenID Connect, что позволяет интегрироваться с внешними провайдерами аутентификации, такими как Google или Facebook.
4. Настраиваемая конфигурация: Вы имеете полный контроль над механизмами аутентификации и авторизации, создавая настраиваемые правила доступа.
🛠 Как начать?
- Добавьте Spring Security в ваш проект через Maven или Gradle.
- Настройте механизм аутентификации, указав его в конфигурационных файлах.
- Определите правила доступа для различных URL в вашем приложении.
#Java #SpringSecurity #Security
👍5❤3