Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод возвращает длину массива byte?
Какой метод возвращает длину массива 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)
Пример: Кастомный коллектор для объединения строк с разделителем
2. Неизменяемые коллекции
Java 10+ предоставляет встроенные коллекторы для неизменяемых коллекций:
2.1. Стандартные неизменяемые коллекторы
2.2. Создание через collectingAndThen
3. Комбинирование подходов
3.1. Неизменяемый кастомный коллектор
3.2. Группировка с неизменяемыми значениями
4. Особенности реализации
4.1. Параллельная обработка
Кастомные коллекторы должны иметь thread-safe аккумулятор или характеристику CONCURRENT
Combiner должен корректно объединять частичные результаты
4.2. Оптимизации
Для примитивов используйте специализированные коллекторы (summingInt, averagingDouble)
Избегайте boxing/unboxing в кастомных коллекторах
4.3. Обработка null
Встроенные неизменяемые коллекторы бросают NullPointerException при null-элементах
Решение:
Когда создавать кастомные коллекторы:
✔️ Для сложной логики агрегации
✔️ Когда встроенные коллекторы не подходят
✔️ Для оптимизации производительности в специфичных сценариях
Когда использовать неизменяемые коллекции:
✔️ Для безопасного возврата результатов из методов
✔️ В многопоточных сценариях
✔️ Для защиты данных от модификации
#Java #Training #Medium #Collectors
Кастомные коллекторы и неизменяемые коллекции
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
Reflection API (оглавление)
Reflection API — Определение, назначение, преимущества и недостатки
Базовые понятия и практическое применение Reflection API
Класс Class и его методы
Класс Class и его методы. Часть 2
Получение информации о полях
Получение информации о полях. Часть 2
Получение информации о методах
Получение информации о методах. Часть 2
Конструктор и как его получить
Работа с параметрами конструкторов
Создание объектов через Reflection
Вызов методов через Reflection
#Content
Reflection API — Определение, назначение, преимущества и недостатки
Базовые понятия и практическое применение Reflection API
Класс Class и его методы
Класс Class и его методы. Часть 2
Получение информации о полях
Получение информации о полях. Часть 2
Получение информации о методах
Получение информации о методах. Часть 2
Конструктор и как его получить
Работа с параметрами конструкторов
Создание объектов через Reflection
Вызов методов через Reflection
#Content
Multithreads in Java (оглавление)
Процессы и потоки (Process API). Класс ProcessBuilder
Запуск внешних процессов и чтение вывода
#Content
Процессы и потоки (Process API). Класс ProcessBuilder
Запуск внешних процессов и чтение вывода
#Content
Основы криптографии в Java (оглавление)
Основы криптографии в Java
Симметричная криптография: алгоритм AES
Асимметричная криптография
Асимметричная криптография. Часть 2
Хэш-функции (SHA-256, MD5)
Соль (Salt) и вектор инициализации (IV)
Классы Cipher и KeyGenerator
Классы SecretKey и IvParameterSpec
Классы KeyPairGenerator и KeyPair
Класс Signature (цифровые подписи)
Base64 в Java Crypto API
Криптографические протоколы (TLS/SSL, HMAC)
#Content
Основы криптографии в Java
Симметричная криптография: алгоритм AES
Асимметричная криптография
Асимметричная криптография. Часть 2
Хэш-функции (SHA-256, MD5)
Соль (Salt) и вектор инициализации (IV)
Классы Cipher и KeyGenerator
Классы SecretKey и IvParameterSpec
Классы KeyPairGenerator и KeyPair
Класс Signature (цифровые подписи)
Base64 в Java Crypto API
Криптографические протоколы (TLS/SSL, HMAC)
#Content
Объектно-реляционное отображение (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
Объектно-реляционное отображение (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, ранее опубликованную на канале - для Вас подготовлено оглавление!
Обновлено оглавление.
В связи с гигантским количеством постов, прежний тип (поочереди) признан несостоятельным и оглавление будет постепенно модифицироваться для удобства, в сторону выделения в отдельные темы.
Прошу понять и потерпеть неудобства
Читайте, используйте, будут вопросы - пишите!
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
В мире 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
Что выведет код?
#Tasks
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
Вопросы с собеседования 👩💻
Какой метод возвращает текущую версию Java?
Какой метод возвращает текущую версию Java?
Anonymous Quiz
38%
System.javaVersion()
19%
Runtime.version()
14%
Java.version()
21%
System.getProperty("java.version")
7%
"Идея дай мне Java"