Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Switch Expressions

В 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😨31🔥1
Рано сдался)
😁38🤡7🤣3🗿2🔥1👏1💯1
ВЕБ-СКРАПИНГ

Веб-скрапинг — это процесс автоматизированного извлечения данных с веб-сайтов. Этот подход позволяет собирать информацию с различных источников, включая новости, отзывы, цены и другие публичные данные. Такого рода практики помогают исследователям, аналитикам и разработчикам анализировать большие объемы информации и использовать ее для разных целей.

Зачем нужен веб-скрапинг?

✔️ Сбор данных: Автоматизированный процесс помогает избежать рутинной работы и значительно экономит время.

✔️ Анализ конкурентов: С помощью скрапа можно отслеживать изменения на сайте конкурентов, выяснять стратегии ценообразования и проводить анализ тенденций.

✔️ Полезные приложения: Создание приложений для мониторинга цен, агрегаторов новостей и других сервисов, использующих живую информацию.

И, главное, помните про соблюдение правил: перед скрапингом сайта обязательно ознакомьтесь с его robots.txt — файлом, который указывает, какие страницы можно скрапить, а какие — нет.
👍92
⌨️ Создание веб-скрапера с помощью Jsoup

Теперь давайте рассмотрим, как создать простой веб-скрапер, используя библиотеку 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
👍113
😁21😱13👍3💯1🍌1
⌨️ Паттерн проектирования: Singleton

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
⌨️ Что такое CI/CD?

Непрерывная интеграция (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
👍71
Надо было по Java брать, такой #&@ни бы не было!
🤣38👍1😁1
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
👍144🔥2
🔧 Maven vs Gradle: Как выбрать систему сборки для вашего проекта?

В мире 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
👍115🔥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
👍53
Паттерн Bridge (Мост)

Паттерн Bridge позволяет разделить абстракцию и её реализацию, чтобы они могли развиваться независимо друг от друга. Это достигается через создание интерфейса (абстракции) и реализаций этого интерфейса. Такой подход позволяет избежать жесткой привязки между системой абстракций и ее реализациями.

Давайте посмотрим на пример, который иллюстрирует паттерн Bridge в контексте рисования фигур:

// Реализация интерфейса для рисования
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}

// Конкретная реализация для рисования на графическом окне
class DrawingAPI1 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API1.circle at {" + x + ", " + y + "} radius " + radius);
}
}

// Конкретная реализация для рисования в ASCII
class DrawingAPI2 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API2.circle at {" + x + ", " + y + "} radius " + radius);
}
}

// Абстракция
abstract class Circle {
protected DrawingAPI drawingAPI; // Ссылка на реализацию

protected Circle(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}

public abstract void draw(); // Метод для рисования
public abstract void resizeByPercentage(double pct); // Метод для изменения размера
}

// Конкретная абстракция
class CircleWithABorder extends Circle {
private double x, y, radius; // Параметры круга

public CircleWithABorder(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI); // Передаем реализацию в абстракцию
this.x = x;
this.y = y;
this.radius = radius;
}

public void draw() {
drawingAPI.drawCircle(x, y, radius); // Используем реализацию для рисования
}

public void resizeByPercentage(double pct) {
radius *= (1 + pct / 100); // Меняем размер круга
}
}


#java #bridge #pattern
👍83
⌨️ Java Concurrency API: Основные классы

Современные приложения все чаще требуют выполнения нескольких задач одновременно, и для этого Java предоставляет мощный инструмент — Concurrency API (набор классов и интерфейсов). Этот API позволяет разработчикам легко реализовывать многопоточность, управлять потоками и синхронизировать действия между ними, что значительно увеличивает производительность и отзывчивость приложений.

Основные классы:

1. Thread
- Класс для создания и управления потоками. Вы можете создать новый поток, реализовав интерфейс Runnable или расширив класс Thread.

2. Executor
- Интерфейс для управления потоками и выполнения задач. Позволяет абстрагироваться от управления потоками, сосредоточившись на логике приложения.
- ExecutorService: расширение Executor, управляющее жизненным циклом потоков.

3. Future
- Позволяет получать результаты из асинхронных задач. Используется в связке с ExecutorService для выполнения задач в фоновом режиме.

4. CountDownLatch
- Синхронизирует потоки, позволяя одному или нескольким потокам ждать завершения других потоков перед продолжением работы.

5. CyclicBarrier
- Используется для синхронизации группы потоков. Позволяет потоку ждать, пока все другие не достигнут определенной точки.

6. Semaphore
- Контролирует доступ к ресурсу, предоставляя определенное количество разрешений для потоков.

7. BlockingQueue
- Интерфейс, предоставляющий безопасный способ обмена данными между потоками при помощи очередей. Реализации включают ArrayBlockingQueue, LinkedBlockingQueue и другие.

#java #ConcurrencyAPI #Thread
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142🔥2
⌨️ Пример реализации CountDownLatch

CountDownLatch позволяет одному или нескольким потокам ждать, когда другие потоки завершат свою работу. Это полезно, когда вы хотите запустить определенные действия только после выполнения нескольких предварительных задач.

Пример кода:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

public static void main(String[] args) throws InterruptedException {
// Создаем CountDownLatch для трех потоков
CountDownLatch latch = new CountDownLatch(3);

// Запускаем три потокa
for (int i = 0; i < 3; i++) {
new Thread(new Task(latch)).start();
}

// Основной поток ждет, пока все потоки завершатся
latch.await();
System.out.println("Все задачи завершены, продолжение работы основного потока.");
}
}

class Task implements Runnable {
private final CountDownLatch latch;

public Task(CountDownLatch latch) {
this.latch = latch;
}

@Override
public void run() {
try {
// Симуляция работы
Thread.sleep((long) (Math.random() * 1000));
System.out.println("Задача завершена: " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// Уменьшаем счетчик
latch.countDown();
}
}
}


Описание кода:

1. Создание CountDownLatch: Мы создаем объект CountDownLatch с начальным значением 3, что означает, что основной поток будет ожидать завершения трех потоков.

2. Запуск потоков: В цикле запускаем три потока, каждый из которых выполняет задачу.

3. Ожидание завершения: В основном потоке вызываем latch.await(), который блокирует его выполнение до тех пор, пока счетчик не достигает нуля.

4. Задача: Каждый поток выполняет свою задачу (симуляция работы) и вызывает latch.countDown() в блоке finally, уменьшая счетчик.

Когда все три потока завершатся, основной поток продолжит выполнение и выведет сообщение.

#java #CountDownLatch
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍2
⌨️ HashMap и TreeMap: Когда и как использовать

В Java коллекции Map предоставляют возможность хранить пары "ключ-значение". Два популярных варианта — HashMap и TreeMap. Давайте разберем их ключевые особенности и когда их лучше использовать.

📚 Kраткие определения:

- HashMap:
  - Неупорядоченная коллекция.
  - Основан на хэш-таблице.

- TreeMap:
  - Упорядоченная коллекция.
  - Основан на красно-черном дереве.
  - Поддерживает сортировку по ключам.

⚖️ Когда использовать:

- HashMap:
  - Если важна производительность и порядок хранения не имеет значения.
  - Когда нужно быстро получать значения по ключу

- TreeMap:
  - Если необходимо хранить элементы в отсортированном порядке.
  - Для использования функционала "примитивного" поиска (например, firstKey() или lastKey()).

📌 Подведение итогов:

Выбор между HashMap и TreeMap зависит от ваших требований к производительности и порядку элементов. Помните, что HashMap лучше подходит для большинства случаев, когда необходим быстрый доступ, а TreeMap — для упорядоченного хранения данных.

#java #HashMap #TreeMap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132
public class Quest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3);
List<Integer> subList = list.subList(1, 2);
subList.set(0, 5);
System.out.println(list.get(1));
}
}


#java #quest
2👎1
⌨️ Сравнение объектов с помощью Comparator и Comparable

В Java для сортировки объектов используются два ключевых интерфейса: Comparable и Comparator. Понимание их отличий и применения поможет вам эффективно управлять сортировкой данных в коллекциях.

📚 Краткие определения:

- Comparable:
- Используется, когда класс должен иметь естественный порядок. Например, мы можем сортировать людей по возрасту.
- Сигнатура метода: int compareTo(T o).

Пример:

class Person implements Comparable<Person> {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // Сравнение по возрасту
}
}


- Comparator:
- Используется для создания внешних стратегий сравнения, позволяя определять несколько способов сортировки. Подходит для сортировки объектов разных классов.
- Сигнатура метода: int compare(T o1, T o2).

Пример:

import java.util.Comparator;

class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name); // Сравнение по имени
}
}


⚖️ Когда использовать:

- Comparable:
- Используйте, если у класса есть естественный порядок. Например, чтобы сортировать людей по возрасту.
- Сортировка с помощью Collections.sort() или Arrays.sort() будет проще.

Пример использования:

List<Person> people = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));
Collections.sort(people); // Сортировка по возрасту с использованием Comparable


- Comparator:
- Идеален для ситуаций, когда необходимо изменить порядок сортировки или сравнивать объекты разных классов.

Пример использования:

List<Person> people = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));
Collections.sort(people, new NameComparator()); // Сортировка по имени с использованием Comparator


#java #Comparator #Comparable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113
public class Quest {
public static void main(String[] args) {
int b = 500;
int c = inc(b);
System.out.println(b==c);
}
private static int inc(int num) {
return num++;
}
}


#java #quest
2👎2
Что выведет код?
Anonymous Quiz
35%
true
50%
false
15%
<Ошибка компиляции>
🎉2