Java for Beginner
688 subscribers
586 photos
161 videos
12 files
900 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Пагинация и фильтрация средствами JAVA.

Встреча от 20.04.2025

Запись встречи -
YOUTUBE
RUTUBE

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

Что мы узнали:
➡️ Что такое пагинация и зачем она нужна.
➡️ Как реализованы интерфейсы Pageable и Specification.
➡️ Рассмотрели способы реализации пагинации и фильтрации.
➡️ Написали небольшой проект, где все это пощупали руками.

Максимально подробно все реализовано в GitHub -
https://github.com/Oleborn/ReserchPagebleAndSpecification

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Всем кто пришел и помогал вопросами, моя большая благодарность! 🤙
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍11
📌 Факт дня:

А вы знали, что первый поисковик назывался Archie?

В 1990 году был создан Archie — первый поисковый инструмент в интернете. Он индексировал FTP-архивы, позволяя искать файлы, и стал предшественником современных поисковиков, таких как Google.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Брюс Шнайер

"Безопасность — это процесс, а не продукт."


Брюс Шнайер, эксперт по криптографии, сказал это в 2000 году в статье для журнала Information Security.

Почитать короткую биографию
И о его работах

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Record классы в Java

Record классы в Java — это специальный вид классов, введенный в Java 16 (JEP 395) как финальная фича после предварительных версий в Java 14 и 15. Они предназначены для упрощения создания неизменяемых (immutable) классов, которые используются для хранения данных, таких как DTO (Data Transfer Objects) или простые модели данных. Основная цель record классов — сократить объем шаблонного кода (boilerplate code), который обычно пишется для классов, хранящих данные, например, для геттеров, конструкторов, методов equals(), hashCode() и toString().

Объявление record класса выглядит следующим образом:

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


В этом примере Person — это record класс с двумя компонентами: name (тип String) и age (тип int).

При компиляции Java автоматически генерирует для этого класса следующее:
Финальные приватные поля для каждой компоненты (name и age).
Публичные методы доступа (геттеры) с именами, совпадающими с названиями компонент, например, name() и age().
Конструктор, который принимает все компоненты и инициализирует их.
Реализацию методов equals(), hashCode() и toString(), которые учитывают все компоненты.


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

Record классы также имеют ряд ограничений. Они не могут наследоваться от других классов (хотя могут реализовывать интерфейсы), и нельзя добавлять новые поля экземпляра, помимо компонент, указанных в объявлении. Однако можно определять статические поля, методы и даже конструкторы с дополнительной логикой.

Пример использования:
Person person = new Person("Alice", 25);
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 25
System.out.println(person); // Person[name=Alice, age=25]


#Java #Training #Medium #Record
👍5
Что выведет код?

public class Task210425 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add(new String("Java"));
set.add(new String("Java"));
set.add("Python");
set.add("Python".intern());

System.out.println(set.size());
}
}


#Tasks
👍3
Варианты ответа:
Anonymous Quiz
3%
1
38%
2
59%
3
0%
4
👍2
Кто работал с AS, все так плохо? 🧐😂

https://t.me/Java_for_beginner_dev

#Mems
👍2😁2
Вопросы с собеседования 👩‍💻

Какой метод используется для удаления первого элемента в LinkedList?
Anonymous Quiz
9%
remove()
19%
deleteFirst()
57%
removeFirst()
15%
pop()
👍1
Кастомизация и использование Record классов

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

Кастомные конструкторы.

В record классе можно определить собственный конструктор, чтобы добавить валидацию или преобразование данных. Например:
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
name = name.trim(); // Удаляем пробелы
}
}


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

Добавление методов.

Record классы поддерживают определение как статических, так и экземплярных методов. Например, можно добавить метод для вычисления чего-либо на основе компонент:
public record Person(String name, int age) {
public String greeting() {
return "Hello, my name is " + name + " and I'm " + age;
}
}


Переопределение стандартных методов.

Если автоматически сгенерированные методы equals(), hashCode() или toString() не подходят, их можно переопределить. Например, можно настроить toString() для специфического формата:
public record Person(String name, int age) {
@Override
public String toString() {
return name + ", " + age + " years old";
}
}


Реализация интерфейсов.

Record классы могут реализовывать интерфейсы, что делает их полезными для интеграции с существующими системами:
public record Person(String name, int age) implements Comparable<Person> {
@Override
public int compareTo(Person other) {
return this.name.compareTo(other.name);
}
}


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

Record классы идеально подходят для моделирования данных в API, конфигураций или результатов запросов. Например, в веб-приложении record может представлять ответ от сервера:
public record ApiResponse(int status, String message, LocalDateTime timestamp) {}


Или для представления точки в двумерном пространстве с дополнительной логикой:

public record Point(double x, double y) {
public double distanceTo(Point other) {
return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
}


Когда использовать record классы?

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

Ограничения и подводные камни.


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

#Java #Training #Medium #Record
👍1
📌 Факт дня:

А вы знали, что игра "Pac-Man" была вдохновлена пиццей?

Тору Иватани, создатель игры Pac-Man (1980), придумал персонажа, увидев пиццу, из которой вырезали кусок. Название "Pac-Man" происходит от японского звука "паку-паку", означающего открытие и закрытие рта.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Джеффри Зельдман

"Контент важнее дизайна."


Джеффри Зельдман, пионер веб-дизайна, написал это в 2001 году в книге "Taking Your Talent to the Web".

Почитать короткую биографию
И его работа

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Sealed-классы и интерфейсы в Java (Java 17+)

1. Что такое sealed-классы и интерфейсы?

С выходом Java 17 (начиная с предварительной версии в Java 15), в язык добавили новую возможность — sealed-классы и интерфейсы. Это расширение системы типов, которое позволяет жестко контролировать и ограничивать наследование.

По умолчанию в Java любой класс open для расширения, если он не final. Но это иногда нарушает инкапсуляцию или архитектурные принципы. Например, ты можешь не хотеть, чтобы кто угодно наследовался от твоего базового класса. До Java 17 у тебя было всего два выбора:

final — нельзя наследовать вообще;

обычный класс — может быть расширен кем угодно.

Sealed-классы добавляют третий путь: ты сам указываешь, какие классы могут расширять данный базовый класс или реализовывать интерфейс.


2. Зачем нужны sealed-типы?

Ограничение наследования: Запрещает произвольное расширение класса/интерфейса.
Безопасность: Компилятор знает все возможные подтипы, что помогает в switch-выражениях и pattern matching.
Четкая архитектура: Позволяет явно указать, какие классы являются частью иерархии.


3. Синтаксис объявления
// Sealed-класс
public sealed class Shape permits Circle, Square, Rectangle { ... }

// Sealed-интерфейс
public sealed interface Animal permits Dog, Cat, Bird { ... }


sealed — модификатор, указывающий, что класс/интерфейс ограничен.
permits — список классов/интерфейсов, которые могут наследовать/реализовывать sealed-тип.


#Java #Training #Medium #Sealed
👍31
Что выведет код?

import java.util.HashSet;

public class Task220425 {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
Integer a = 128;
Integer b = 128;
set.add(a);
set.add(b);
set.add(null);
set.add(null);

System.out.println(set.size());
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
14%
1
53%
2
14%
3
19%
4
👍2
Пить надо с умом, а не с котом☝️ 🤪

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Вопросы с собеседования 👩‍💻

Какой метод используется для получения текущего объекта класса Thread?
Anonymous Quiz
10%
System.thread()
25%
Thread.getThread()
43%
Thread.currentThread()
Sealed-классы и интерфейсы в Java (Java 17+)

1. Правила для sealed-классов

Классы, указанные в permits, должны:
Быть прямыми наследниками sealed-класса.

Иметь один из модификаторов:
final — запрещает дальнейшее наследование.
sealed — разрешает наследование, но с новым permits.
non-sealed — снимает ограничения (класс становится открытым для наследования).


2. Пример sealed-иерархии
public sealed class Shape permits Circle, Square, Rectangle { ... }

public final class Circle extends Shape { ... } // Нельзя наследовать
public non-sealed class Square extends Shape { ... } // Можно наследовать
public sealed class Rectangle extends Shape permits FilledRectangle { ... }
public final class FilledRectangle extends Rectangle { ... }


3. Sealed-интерфейсы

Аналогично классам, но с реализацией:
public sealed interface Animal permits Dog, Cat { ... }
public final class Dog implements Animal { ... }
public record Cat() implements Animal { ... } // record тоже может реализовывать sealed-интерфейс


Pattern matching, ограничения и рекомендации

Sealed-типы отлично работают с switch:

public String getShapeType(Shape shape) {
return switch (shape) {
case Circle c -> "Circle";
case Square s -> "Square";
case Rectangle r -> "Rectangle";
// Компилятор знает все варианты, поэтому default не обязателен!
};
}


Ограничения

Sealed-класс и его наследники должны находиться в одном модуле или одном пакете (если модулей нет).
В permits нельзя указывать несуществующие классы.


Best practices

Используйте sealed для критичных иерархий (например, AST в компиляторах).
Предпочитайте final или sealed для большинства наследников, чтобы избежать неконтролируемого расширения.
Комбинируйте с record для неизменяемых DTO.


#Java #Training #Medium #Sealed
👍3
📌 Факт дня:

А вы знали, что первый CD был создан для хранения музыки?

Компакт-диск (CD), разработанный Philips и Sony в 1982 году, изначально предназначался для аудиозаписей. Первый коммерческий CD содержал альбом "The Visitors" группы ABBA, а позже CD стали стандартом для хранения данных.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Дэн Бриклин

"Электронные таблицы изменили способ ведения бизнеса."


Дэн Бриклин, создатель VisiCalc, сказал это в 1979 году в интервью после запуска программы.

Почитать короткую биографию
И его работа. Стоит внимания

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Comparable и Comparator, их назначение и различия

В Java сортировка коллекций — важная задача, и для ее решения используются интерфейсы Comparable и Comparator. Они позволяют определять порядок элементов в коллекциях, таких как List, Set или Map, при использовании методов вроде Collections.sort() или Arrays.sort(). Понимание их различий, механизмов работы и правильного применения критично для написания эффективного кода.

Comparable: естественный порядок сортировки

Comparable — это интерфейс, определенный в пакете java.lang. Он используется, когда класс должен иметь "естественный" порядок сортировки, то есть порядок, который логически присущ объектам этого класса. Например, для строк естественный порядок — лексикографический, для чисел — числовой.

Класс, реализующий Comparable, должен имплементировать метод compareTo(T o), который возвращает:
Отрицательное число, если текущий объект "меньше" аргумента.
Ноль, если объекты равны.
Положительное число, если текущий объект "больше".


Пример реализации Comparable для класса Person, сортирующего по возрасту:
public class Person implements Comparable { private String name; private int age;

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

@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}

@Override
public String toString() {
return name + " (" + age + ")";
}

}


Здесь объекты Person сортируются по возрастанию возраста.

Чтобы использовать такую сортировку, достаточно передать список объектов в Collections.sort():
List people = new ArrayList<>(); 
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);
System.out.println(people); // Вывод: [Bob (25), Alice (30)]


Comparator: гибкая сортировка

Comparator — интерфейс из пакета java.util, предназначенный для определения альтернативных или внешних порядков сортировки.

Он полезен, когда:
Класс не реализует Comparable.
Требуется сортировка по разным критериям.
Нет доступа к исходному коду классов.


Comparator требует реализации метода compare(T o1, T o2), который сравнивает два объекта и возвращает аналогичные значения: отрицательное, ноль или положительное.

Пример Comparator для сортировки Person по имени:

import java.util.Comparator;

public class NameComparator implements Comparator {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}


Использование:
List people = new ArrayList<>(); 
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people,
new NameComparator());
System.out.println(people); // Вывод: [Alice (30), Bob (25)]


Ключевое различие

Comparable определяет естественный порядок внутри класса (реализуется самим классом).
Comparator определяет внешний порядок и может быть реализован отдельно, что делает его более гибким.


#Java #Training #Medium #Comparable #Comparator
👍4
И сколько часов сможешь на него списать.

https://t.me/Java_for_beginner_dev

#Mems
👍2