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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Ну да, вот только джуну 40+, а сеньору 23... 😂

https://t.me/Java_for_beginner_dev

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

Какой метод возвращает длину массива byte?
Anonymous Quiz
15%
getLength()
12%
count()
24%
size()
49%
length
Collectors в Java

Кастомные коллекторы и неизменяемые коллекции

1. Создание кастомных коллекторов

Коллектор реализует интерфейс Collector<T, A, R>, где:
T – тип элементов потока
A – тип аккумулятора (промежуточное хранилище)
R – тип результата


Компоненты коллектора:
Supplier<A> – создает контейнер для накопления
BiConsumer<A, T> – добавляет элемент в контейнер
BinaryOperator<A> – объединяет частичные результаты (для параллельных стримов)
Function<A, R> – преобразует аккумулятор в результат
Characteristics (опционально) – набор характеристик (CONCURRENT, UNORDERED, IDENTITY_FINISH)


Пример: Кастомный коллектор для объединения строк с разделителем
Collector<String, StringBuilder, String> joinStrings = Collector.of(
StringBuilder::new, // supplier
(sb, str) -> { // accumulator
if (!sb.isEmpty()) sb.append(", ");
sb.append(str);
},
(sb1, sb2) -> { // combiner (для параллельных стримов)
if (sb1.length() > 0 && sb2.length() > 0) {
sb1.append(", ");
}
return sb1.append(sb2);
},
StringBuilder::toString // finisher
);

String result = Stream.of("Java", "Kotlin", "Scala")
.collect(joinStrings);

// Результат: "Java, Kotlin, Scala"


2. Неизменяемые коллекции

Java 10+ предоставляет встроенные коллекторы для неизменяемых коллекций:

2.1. Стандартные неизменяемые коллекторы
List<String> unmodifiableList = stream.collect(Collectors.toUnmodifiableList());
Set<String> unmodifiableSet = stream.collect(Collectors.toUnmodifiableSet());
Map<String, Integer> unmodifiableMap = stream.collect(
Collectors.toUnmodifiableMap(
keyMapper,
valueMapper,
mergeFunction // для обработки дубликатов
)
);


2.2. Создание через collectingAndThen
List<String> immutable = stream
.collect(Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
));


3. Комбинирование подходов

3.1. Неизменяемый кастомный коллектор
Collector<String, List<String>, List<String>> toImmutableList = Collector.of(
ArrayList::new, // supplier
List::add, // accumulator
(left, right) -> { // combiner
left.addAll(right);
return left;
},
Collections::unmodifiableList // finisher
);


3.2. Группировка с неизменяемыми значениями
Map<String, List<Integer>> immutableGroups = numbers.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(
n -> n % 2 == 0 ? "even" : "odd"
),
Collections::unmodifiableMap
));


4. Особенности реализации


4.1. Параллельная обработка
Кастомные коллекторы должны иметь thread-safe аккумулятор или характеристику CONCURRENT
Combiner должен корректно объединять частичные результаты


4.2. Оптимизации
Для примитивов используйте специализированные коллекторы (summingInt, averagingDouble)
Избегайте boxing/unboxing в кастомных коллекторах


4.3. Обработка null
Встроенные неизменяемые коллекторы бросают NullPointerException при null-элементах

Решение:
.filter(Objects::nonNull)
.collect(toUnmodifiableList())


Когда создавать кастомные коллекторы:
✔️ Для сложной логики агрегации
✔️ Когда встроенные коллекторы не подходят
✔️ Для оптимизации производительности в специфичных сценариях


Когда использовать неизменяемые коллекции:
✔️ Для безопасного возврата результатов из методов
✔️ В многопоточных сценариях
✔️ Для защиты данных от модификации


#Java #Training #Medium #Collectors
Объектно-реляционное отображение (ORM - Object-Relational Mapping) (оглавление)

Объектно-реляционное отображение (ORM - Object-Relational Mapping)
EntityManager
Аннотация @Entity
Аннотация @Table
Аннотация @Id
Аннотация @GeneratedValue
Аннотация @Column
Аннотация @Transient
Аннотация @Enumerated
Аннотация @Temporal
Аннотация @Lob
Аннотация @Version
Аннотация @Access Аннотации @AttributeOverride и @AttributeOverrides
Аннотация @Embeddable
Аннотация @Embedded
Аннотация @Inheritance
Аннотации @DiscriminatorColumn и @DiscriminatorValue
Аннотация @MappedSuperclass
Аннотация @OneToOne
Аннотации @OneToMany и @ManyToOne
Аннотация @ManyToMany
Аннотация @JoinColumn
Аннотация @JoinTable
Аннотация @ElementCollection
Аннотация @OrderColumn
Аннотация @PrimaryKeyJoinColumn
Аннотация @SecondaryTable
Аннотации @NamedQuery и @NamedQueries
Аннотации @NamedNativeQuery и @NamedNativeQueries
Аннотации @Convert и @Converter
Аннотации @PrePersist и @PostPersist
Аннотации @PreUpdate и @PostUpdate
Аннотации @PreRemove и @PostRemove

Аннотации Spring Data JPA

Аннотация @Query
Аннотация @Modifying
Аннотация @Param
Аннотация @Transactional
Аннотация @EnableJpaRepositories
Аннотация @EntityGraph
Аннотация @Lock
Аннотация @Procedure
Аннотация @IdClass
Аннотация @MapsId
Аннотация @CreatedBy
Аннотация @CreatedDate
Аннотации @LastModifiedBy и @LastModifiedDate
Аннотация @Version
Аннотация @PersistenceContext
Аннотация @EnableJpaAuditing
Аннотация @EntityListeners
Аннотация @Projection

Hibernate

Аннотация @Any
Аннотация @BatchSize
Аннотации @Cache и @Cacheable
Аннотация @Cascade
Аннотация @ColumnTransformer
Аннотация @DynamicInsert
Аннотация @DynamicUpdate
Аннотация @Filter
Аннотация @Formula
Аннотация @Generated
Аннотация @Immutable
Аннотация @Index
Аннотация @LazyCollection
Аннотация @LazyToOne
Аннотация @Loader
Аннотация @ManyToAny
Аннотация @MetaValue
Аннотация @NaturalId
Аннотация @NotFound
Аннотация @OnDelete
Аннотация @TableGenerator
Аннотация @OptimisticLock

#Content
☄️ Оглавление для обучающих постов.
(периодически обновляемое)

Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление!

✔️ Пользуйтесь на здоровье!

🔜 Часть 1.
🔜 Часть 2.
🔜 Часть 3. SPRING
🔜 Часть 4. SPRING продолжение
🔜 Функциональное программирование
🔜 Reflection API
🔜 Модульность в Java
🔜 Multithreads in Java
🔜 Описание классов в Java
🔜 Comparable и Comparator
🔜 Collectors в Java
🔜 Основы криптографии в Java
🔜 Объектно-реляционное отображение (Аннотации JPA и Hibernate)

🔜 Установка IntelliJ IDEA Ulimate

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

Прошу понять и потерпеть неудобства
🤝

Читайте, используйте, будут вопросы - пишите! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Jackson

В мире Java-программирования одна из самых частых задач — это работа с JSON. Будь то обмен данными между сервером и клиентом, интеграция с внешними API или хранение конфигураций — JSON стал стандартом де-факто. Именно для этих целей и был создан Jackson.

Что такое Jackson

Jackson — это одна из самых популярных Java-библиотек для работы с JSON. Она позволяет сериализовать объекты Java в JSON и обратно — десериализовать JSON в Java-объекты. Причем делает это быстро, эффективно и с минимальными накладными расходами.

Быстрая история

2007 год — Джейсон Т. Смит (Jason T. Smith) начал разработку Jackson.
2009 год — Первый стабильный релиз (Jackson 1.x).
2012 год — Выпуск Jackson 2.0 с полностью переработанным API.
Сейчас — Jackson активно поддерживается, последняя версия (на 2024 год) — Jackson 2.16+.


Где используется Jackson

Сегодня Jackson используется практически везде, где в Java-приложениях требуется работа с JSON:
В REST API на базе Spring Boot и других фреймворков
В микросервисной архитектуре для обмена данными между сервисами
При интеграции с внешними веб-сервисами
Для сохранения и чтения конфигураций в формате JSON
В тестировании при генерации или проверке JSON-структур
Многие крупные компании и проекты строят на Jackson свою работу с данными. Более того, Spring Framework по умолчанию использует Jackson для сериализации и десериализации JSON, что дополнительно укрепило его позиции.


Почему Jackson так популярен

Есть несколько причин, почему Jackson стал стандартом:

Производительность
Jackson славится своей высокой скоростью работы, что критично при обработке больших объемов данных.

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

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

Расширяемость
Jackson предлагает богатую экосистему модулей: поддержка новых типов данных (например, Java 8 Date/Time API), работа с CBOR, XML, YAML и другими форматами.

Интеграция с фреймворками
Такие популярные решения как Spring Boot, Dropwizard и многие другие "из коробки" работают с Jackson.

#Java #Training #Medium #Jackson
Что выведет код?

import java.util.*;

public class Task020525 {
public static void main(String[] args) {
TreeSet<Integer> tree = new TreeSet<>();
tree.add(5);
tree.add(3);
tree.add(8);
tree.add(3);

System.out.println(tree.floor(4) + " " + tree.ceiling(4));
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
15%
5 3
15%
3 3
56%
3 5
15%
null null
И заставит думать о себе плохое 😂

https://t.me/Java_for_beginner_dev

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

Какой метод возвращает текущую версию Java?
Anonymous Quiz
38%
System.javaVersion()
19%
Runtime.version()
14%
Java.version()
21%
System.getProperty("java.version")
7%
"Идея дай мне Java"
Jackson. Быстрая сериализация и десериализация объектов

Работа с JSON в Jackson строится вокруг главного класса — ObjectMapper. Это основной инструмент для конвертации Java-объектов в JSON и обратно.

ObjectMapper: главный рабочий инструмент

ObjectMapper — это универсальный класс, предоставляющий удобные методы для:
Сериализации (преобразования объекта в JSON)
Десериализации (преобразования JSON обратно в объект)


Создание экземпляра максимально простое:
ObjectMapper objectMapper = new ObjectMapper();


Сериализация объекта в JSON

Сериализация — это процесс превращения Java-объекта в строку JSON.

Рассмотрим пример:
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();

User user = new User("Alice", 25);

String jsonString = objectMapper.writeValueAsString(user);
System.out.println(jsonString);
}
}

class User {
private String name;
private int age;

public User() {
}

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

// Геттеры и сеттеры обязательны для Jackson
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}


Результат работы программы:
{"name":"Alice","age":25}

writeValueAsString превращает объект в строку JSON. Можно также сохранить результат сразу в файл через writeValue(new File("user.json"), user).


Десериализация JSON в объект

Десериализация — это обратный процесс: превращение JSON-строки в объект Java.

Пример:
String jsonInput = "{\"name\":\"Bob\",\"age\":30}";

User user = objectMapper.readValue(jsonInput, User.class);

System.out.println(user.getName()); // Выведет: Bob
System.out.println(user.getAge()); // Выведет: 30

readValue принимает JSON и класс, в который нужно преобразовать данные. Важно, чтобы у целевого класса был публичный конструктор без параметров и стандартные геттеры/сеттеры.


На что обратить внимание

🔹 Обязательны геттеры/сеттеры или public-поля (иначе Jackson не увидит поля).
🔹 Пустой конструктор нужен для десериализации.
🔹 Имена полей JSON и Java должны совпадать (или использовать аннотации, об этом в след. посте).
🔹 Обработка исключений — методы writeValueAsString() и readValue() могут выбросить JsonProcessingException.


#Java #Training #Medium #Jackson