Операция
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В этой статье разбираются алгоритмы сортировки Java и примеры их реализации. В том числе выясняется, как выбрать подходящий алгоритм для конкретной задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
robotdreams.cc
Повний гайд з алгоритмів сортування на Java для новачків
Вчимося працювати з масивами та списками
👍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 — это поведенческий паттерн, который превращает запросы в объекты, позволяя параметризировать методы другими запросами, ставить запросы в очередь или логировать их.
Использование:
🔹 Для отделения отправителя запроса от объекта, который выполняет действие, чтобы упростить изменение или отмену команд.
🔹 Для реализации очередей команд или их многоуровневой отмены.
🔹 Для логирования команд с возможностью их повторного выполнения.
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Scheduler — это часть Spring Framework, которая позволяет планировать и выполнять задачи в заданное время или по расписанию. Он избавляет от необходимости интеграции сторонних библиотек, предлагая встроенные решения для управления задачами.
Виды задач:
- @Scheduled — аннотация для запуска методов по расписанию.
- TaskScheduler — интерфейс для более гибкого управления задачами.
- Cron-выражения — для сложных расписаний.
- Простота использования за счёт минимальной конфигурации.
- Интеграция с другими частями Spring.
- Поддержка CRON-выражений для гибкости.
- Ограниченная поддержка в распределённых системах.
- Возможные сложности с тестированием задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
~ Побитовый унарный оператор NOT;& Побитовый AND;&= Побитовый AND с присваиванием;| Побитовый OR;|= Побитовый OR с присваиванием;^ Побитовый исключающее XOR;^= Побитовый исключающее XOR с присваиванием;>> Сдвиг вправо (деление на 2 в степени сдвига);>>= Сдвиг вправо с присваиванием;>>> Сдвиг вправо без учёта знака;>>>= Сдвиг вправо без учёта знака с присваиванием;<< Сдвиг влево (умножение на 2 в степени сдвига);<<= Сдвиг влево с присваиванием.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Microservices Project using Spring Boot
Подробный гайд по созданию микросервисов с использованием Spring Boot.
В этом учебном пособии показано как создавать микросервис с использованием Spring Boot 3, Spring Cloud и базы данных PostgreSQL.
В этом микросервисном проекте вы изучите такие важные понятия, как
⛓ Ссылка: тык
👉 Java Rocks | #ресурсы
Подробный гайд по созданию микросервисов с использованием Spring Boot.
В этом учебном пособии показано как создавать микросервис с использованием Spring Boot 3, Spring Cloud и базы данных PostgreSQL.
В этом микросервисном проекте вы изучите такие важные понятия, как
API Gateway, Config Server, Discovery Server, и практически реализуете два реальных микросервиса - Student и School.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"));
}
}— Порождающие паттерны:
🔹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 — Добавляет новые операции в класс, не изменяя его.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
В 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());
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
FastЕxcel
FastExcel — это легкая и производительная библиотека Java для работы с файлами Excel. Она позволяет читать, создавать и модифицировать электронные таблицы XLSX, используя простой и понятный API.
⛓ Ссылка: тык
👉 Java Rocks | #ресурсы
FastExcel — это легкая и производительная библиотека Java для работы с файлами Excel. Она позволяет читать, создавать и модифицировать электронные таблицы XLSX, используя простой и понятный API.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - dhatim/fastexcel: Generate and read big Excel files quickly
Generate and read big Excel files quickly. Contribute to dhatim/fastexcel development by creating an account on GitHub.
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 — это специальный тип данных, введенный в 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) {}Варианты использования:
Record не может наследовать другие классы, что может ограничить его применение в некоторых архитектурах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Отличное понимание ролей API Gateway и Load Balancer является ключевым для проектирования масштабируемых и эффективных архитектур.
— API Gateway: Почтальон цифрового мира 📬
Работает как почтальон, направляя API-запросы к нужному сервису. А также выполняет роль охранника, управляя аутентификацией и авторизацией, переводчика, преобразуя запросы и ответы, и регулировщика движения, контролируя частоту запросов.
— Load Balancer: Регулировщик движения 🚦
Его задача — равномерно распределять трафик между серверами, предотвращая их перегрузку, улучшая надежность и обеспечивая автоматическое переключение в случае сбоя одного из серверов.
Оба компонента необходимы в современных архитектурах, но выполняют разные функции!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Дженерики позволяют определить параметр типа, который будет заменен конкретным типом данных при создании экземпляра класса или вызове метода. Например,
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 при создании объекта.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Принципы SOLID с примерами на Java
Отличная демонстрация принципов SOLID на Java, к каждому пункту приведён антипаттерн «как делать не нужно»
⛓ Ссылка: тык
👉 Java Rocks | #ресурсы
Отличная демонстрация принципов SOLID на Java, к каждому пункту приведён антипаттерн «как делать не нужно»
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);
}
}