JavaRocks
2.36K subscribers
145 photos
14 videos
312 links
Базовый канал для изучения языка Java.

Наш сайт: javarocks.ru

Все необходимые туториалы и материалы.

Тесты для проверки знаний. Лучшие практики и паттерны проектирования.

@viktorreh
@anothertechrock
Download Telegram
⌨️ Срезы в стримах. Метод dropWhile

Операция dropWhile служит дополнением к операции takeWhile. Она отбрасывает первые элементы, для которых предикат возвращает true. Как только результат вычисления предиката становится ложным, она прекращает работу и возвращает все оставшиеся элементы, причем работает даже в том случае, если число оставшихся элементов бесконечно!


List<Integer> ints = List.of(1,2,3,4,5,6,7,8,9);
ints.stream()
.dropWhile(i -> i < 5)
.forEach(System.out::println);
// 5 6 7 8 9


👉 Java Rocks | #java #stream #dropWhile
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔥Полный гайд по алгоритмам сортировки на Java

В этой статье разбираются алгоритмы сортировки Java и примеры их реализации. В том числе выясняется, как выбрать подходящий алгоритм для конкретной задачи.

✍️ Особенно актуально для собеседующихся

Ссылка: тык

👉 Java Rocks | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
public class Quest {
public static void main(String[] args) {
int x = 5;
int y = 8;

if (x++ > 5 && ++y > 8) {
x++;
}

System.out.println("x = " + x + ", y = " + y);
}
}
👍3🤨1
🕯 Паттерн Command (Команда)

Command — это поведенческий паттерн, который превращает запросы в объекты, позволяя параметризировать методы другими запросами, ставить запросы в очередь или логировать их.

Использование:

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

Преимущества:


1️⃣ Инкапсуляция операций в отдельные объекты упрощает расширение системы. Это позволяет легко добавлять новые команды, не изменяя существующий код.
2️⃣ Command предоставляет гибкость в управлении действиями: их можно откладывать, отменять или хранить для последующего выполнения, что делает его полезным в сценариях с очередями задач или транзакциями.
3️⃣ Команды можно комбинировать, создавая макрокоманды для выполнения последовательностей операций, что упрощает выполнение сложных сценариев.
4️⃣ Реализует принцип открытости-закрытости: можно добавлять новые команды без изменения существующего кода.

Недостатки:

1️⃣ Необходимость хранения истории команд для их отмены может потребовать значительных ресурсов, что делает паттерн менее эффективным в системах с ограниченной памятью.
2️⃣ Добавление новых команд требует создания новых классов, что увеличивает объем работы и поддерживает сложность системы.

👉 Java Rocks | #паттерны
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Spring Scheduler: Управление расписанием задач на Java

Spring Scheduler — это часть Spring Framework, которая позволяет планировать и выполнять задачи в заданное время или по расписанию. Он избавляет от необходимости интеграции сторонних библиотек, предлагая встроенные решения для управления задачами.

Виды задач:

- @Scheduled — аннотация для запуска методов по расписанию.
- TaskScheduler — интерфейс для более гибкого управления задачами.
- Cron-выражения — для сложных расписаний.

✔️ Преимущества:

- Простота использования за счёт минимальной конфигурации.
- Интеграция с другими частями Spring.
- Поддержка CRON-выражений для гибкости.

Недостатки:

- Ограниченная поддержка в распределённых системах.
- Возможные сложности с тестированием задач.

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
⌨️ Какие побитовые операции вы знаете?

~ Побитовый унарный оператор NOT;

& Побитовый AND;

&= Побитовый AND с присваиванием;

| Побитовый OR;

|= Побитовый OR с присваиванием;

^ Побитовый исключающее XOR;

^= Побитовый исключающее XOR с присваиванием;

>> Сдвиг вправо (деление на 2 в степени сдвига);

>>= Сдвиг вправо с присваиванием;

>>> Сдвиг вправо без учёта знака;

>>>= Сдвиг вправо без учёта знака с присваиванием;

<< Сдвиг влево (умножение на 2 в степени сдвига);

<<= Сдвиг влево с присваиванием.

👉 Java Rocks | #java #bitwise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Microservices Project using Spring Boot

Подробный гайд по созданию микросервисов с использованием Spring Boot.

В этом учебном пособии показано как создавать микросервис с использованием Spring Boot 3, Spring Cloud и базы данных PostgreSQL.

В этом микросервисном проекте вы изучите такие важные понятия, как API Gateway, Config Server, Discovery Server, и практически реализуете два реальных микросервиса - Student и School.

Ссылка: тык

👉 Java Rocks | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
class Person {
Long id;
String name;

public Person(Long id, String name) {
this.id = id;
this.name = name;
}

@Override
public boolean equals(Object obj) {
System.out.print(1);
if (obj == this) {
return true;
}
if (obj instanceof Person person) {
return id.equals(person.id);
}
return false;
}
}

public class Quest {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(1L, "Leo"));
list.add(new Person(2L, "Raph"));
list.add(new Person(3L, "Donnie"));
list.add(new Person(4L, "Mikey"));

list.contains(new Person(3L, "Shredder"));
}
}
💯4
ℹ️ Паттерны для тех, кто уже покорил Singleton

— Порождающие паттерны:

🔹Abstract Factory: Family Creator — Создает группы взаимосвязанных объектов.
🔹Builder: Lego Master — Пошагово создает объекты.
🔹Prototype: Clone Maker — Создает копии полностью подготовленных объектов.
🔹Singleton: One and Only — Создаёт объект, который существует в единственном экземпляре.

— Структурные паттерны:

🔹Adapter: Universal Plug — Соединяет объекты с разными интерфейсами.
🔹Bridge: Function Connector — Связывает то, как объект работает, с тем, что он делает.
🔹Composite: Tree Builder — Формирует древовидные структуры из простых и сложных частей.
🔹Decorator: Customizer — Добавляет новые возможности объектам, не изменяя их основную структуру.
🔹Facade: One-Stop-Shop — Представляет всю систему через один упрощенный интерфейс.
🔹Flyweight: Space Saver — Эффективно использует небольшие, многократно используемые объекты.
🔹Proxy: Stand-In Actor — Представляет другой объект, управляя доступом или действиями.

— Поведенческие паттерны:

🔹Chain of Responsibility: Request Relay — Передает запросы через цепочку объектов до тех пор, пока он не будет обработан.
🔹Command: Task Wrapper — Превращает запрос в объект, готовый к выполнению.
🔹Iterator: Collection Explorer — Доступ к элементам коллекции по одному.
🔹Mediator: Communication Hub — Упрощает взаимодействие между различными классами.
🔹Memento: Time Capsule — Сохраняет и восстанавливает состояние объекта.
🔹Observer: News Broadcaster — Уведомляет классы о изменениях в других объектах.
🔹Visitor: Skillful Guest — Добавляет новые операции в класс, не изменяя его.

💬 Какие паттерны вы использовали в реальных кейсах?

👉 Java Rocks | #паттерны
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
⌨️ Срезы в стримах. Метод takeWhile

В Java 9 появилось два новых метода, полезных для выбора элементов потока с хорошей производительностью: takeWhile и dropWhile.

Допустим, у нас есть следующий список блюд:

List<Dish> specialMenu = Arrays.asList(
new Dish("seasonal fruit", 120),
new Dish("prawns", 300),
new Dish("rice", 350),
new Dish("chicken", 400),
new Dish("french fries", 530));


Для получения блюд с калорийностью меньше 320, можно воспользоваться операцией filter. Недостаток операции filter в том, что она требует прохода в цикле по всему потоку данных с применением предиката ко всем элементам.

В нашем примере список уже отсортирован по числу калорий. Вместо того, чтобы пройтись по каждому элементу, можно прекратить работу сразу же после обнаружения блюда, содержащего 320 калорий или более. В случае небольшого списка это может показаться не таким уж громадным преимуществом, но при работе с потенциально большим потоком элементов окажется весьма полезным.

Поможет нам в этом операция takeWhile! Она позволяет выполнить срез любого потока данных (даже бесконечного) с помощью предиката. И, к счастью, она прекращает работу сразу же по обнаружении неподходящего элемента. Вот как ее следует использовать:

List<Dish> sliceMenu1
= specialMenu.stream()
.takeWhile(dish -> dish.getCalories() < 320)
.collect(toList());


👉 Java Rocks | #java #stream #takeWhile
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
FastЕxcel

FastExcel — это легкая и производительная библиотека Java для работы с файлами Excel. Она позволяет читать, создавать и модифицировать электронные таблицы XLSX, используя простой и понятный API.

Ссылка: тык

👉 Java Rocks | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
public class Quest {
public static void main(String[] args) {
int b = oper2() | oper3() & oper4();
System.out.println("-" + b);
}
private static byte oper2() {
System.out.print(2);
return 2;
}
private static byte oper3() {
System.out.print(3);
return 3;
}
private static byte oper4() {
System.out.print(4);
return 4;
}
}
Что такое Record?

Record — это специальный тип данных, введенный в Java 14 (и стабилизированный в Java 16), который значительно упрощает создание неизменяемых объектов. Который избавляет от необходимости вручную прописывать всю «рутинную» работу по созданию классов с полями, конструктором, геттерами, equals(), hashCode() и toString().

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

public record Person(String name, int age) {}


Этот код автоматически создаст:


▪️ Конструктор Person(String name, int age)
▪️ Методы доступа name() и age()
▪️ Методы equals(), hashCode() и toString()

Допустим, нужно создать класс для хранения информации о сотруднике:

public class Employee {
private final String name;
private final String position;
private final int salary;

public Employee(String name, String position, int salary) {
this.name = name;
this.position = position;
this.salary = salary;
}

public String getName() {
return name;
}

public String getPosition() {
return position;
}

public int getSalary() {
return salary;
}

@Override
public boolean equals(Object o) { ... }

@Override
public int hashCode() { ... }

@Override
public String toString() { ... }
}


Все это можно заменить одной строкой с использованием Record:

public record Employee(String name, String position, int salary) {}


Варианты использования:

1️⃣ Неизменяемые объекты: Если нужно создать неизменяемый объект, который будет безопасен для многопоточного использования и не будет изменяться после создания.
2️⃣ Data Transfer Objects (DTO): Record хорошо подходит для классов, которые используются для передачи данных между компонентами системы.
3️⃣ Модели для API: Используйте Record для создания простых и неизменяемых моделей в REST API, что повышает предсказуемость и упрощает поддержку.

⚠️ Важно:

Record не может наследовать другие классы, что может ограничить его применение в некоторых архитектурах.

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
API Gateway vs. Load Balancer: В чём разница?

Отличное понимание ролей API Gateway и Load Balancer является ключевым для проектирования масштабируемых и эффективных архитектур.

— API Gateway: Почтальон цифрового мира 📬

Работает как почтальон, направляя API-запросы к нужному сервису. А также выполняет роль охранника, управляя аутентификацией и авторизацией, переводчика, преобразуя запросы и ответы, и регулировщика движения, контролируя частоту запросов.

— Load Balancer: Регулировщик движения 🚦

Его задача — равномерно распределять трафик между серверами, предотвращая их перегрузку, улучшая надежность и обеспечивая автоматическое переключение в случае сбоя одного из серверов.

Оба компонента необходимы в современных архитектурах, но выполняют разные функции! 🌐

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
⌨️ Дженерики (generics) — это механизм, который позволяет создавать классы, интерфейсы и методы, работающие с различными типами данных, при этом сохраняя строгую типизацию. Они были введены в Java начиная с версии 5 для повышения безопасности типов и повторного использования кода.

Дженерики позволяют определить параметр типа, который будет заменен конкретным типом данных при создании экземпляра класса или вызове метода. Например, List<T> может использоваться как List<String>, List<Integer> и т.д.

Благодаря дженерикам, ошибки типа (например, попытка вставить объект неправильного типа) обнаруживаются на этапе компиляции, а не во время выполнения программы.

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

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


public class Box<T> {
private T item;

public void setItem(T item) {
this.item = item;
}

public T getItem() {
return item;
}
}

Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String str = stringBox.getItem();

В этом примере класс Box<T> является обобщенным и может работать с любым типом данных, который заменит T при создании объекта.

👉 Java Rocks | #java #generics #T
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Принципы SOLID с примерами на Java

Отличная демонстрация принципов SOLID на Java, к каждому пункту приведён антипаттерн «как делать не нужно»

Ссылка: тык

👉 Java Rocks | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
🍌2👍1
class A {
static class B {
static String C = "NOT TO BE";
}
static Z B = new Z();
}

class Z {
String C = "TO BE";
}

public class Quest {
public static void main(String[] args) {
System.out.println(A.B.C);
}
}