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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Захват переменных в лямбда-выражениях

Лямбда-выражения могут захватывать переменные из внешнего окружения, делая их доступными внутри лямбда-функции. При этом переменные могут быть:

1️⃣ Неизменяемыми (effectively final) – Переменная из внешнего контекста, используемая в лямбде, должна быть объявлена как final или фактически быть неизменяемой (то есть не изменяться после первого присваивания). Например:

int x = 10;
Runnable r = () -> System.out.println(x); // x захвачен в лямбде


2️⃣ Свободными от изменения в лямбде – Лямбда не может изменять захваченные переменные. Это ограничение гарантирует, что нет неоднозначного состояния, когда переменная изменяется из нескольких мест (например, из основного потока и из лямбда-функции одновременно).

3️⃣ Статическими или полями класса – В отличие от локальных переменных, статические поля класса или поля экземпляра могут свободно изменяться внутри лямбда-выражений, поскольку их значения хранятся в куче (heap) и доступны по ссылке.

Пример:

public class Main {
private static int staticVar = 20;

public static void main(String[] args) {
int localVar = 10;
Runnable r = () -> System.out.println(localVar + staticVar);
r.run();
}
}


В этом примере localVar захватывается, так как он effectively final, а staticVar доступен, так как это статическое поле.

#java #lambda #capturing
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍21
⌨️ Метод Optional.or()

Метод 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
👎62🤝1
⌨️ Модификатор abstract

Класс, помеченный модификатором abstract, называется абстрактным и может служить только в качестве родительского для других классов. Создавать объекты самого абстрактного класса нельзя. При этом наследовать абстрактный класс могут как другие абстрактные классы, так и обычные классы, допускающие создание экземпляров.

Метод, обозначенный ключевым словом abstract, называется абстрактным методом и не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.

Абстрактные классы и методы позволяют создать шаблон объекта, который необходимо реализовать в дочерних классах. В самих же абстрактных классах задаётся только общее поведение для всех наследников.

#java #abstract
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3
Кажется пора поработать
😁34🤣14
⌨️ Интерфейс (interface)

Интерфейс (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
👍142🤯1
⌨️ private методы в интерфейсах

В 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() используется для сравнения двух объектов на равенство. Он определен в классе 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
public class Quest {
public static void main(String[] args) {
Boolean b;
System.out.println(Boolean.TRUE.equals(!b));
}
}


#java #quest
6👎1
Что выведет код?
Anonymous Quiz
31%
true
26%
false
43%
<Ошибка компиляции>
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
⌨️ 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