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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Забыл напомнить Вам что мы вновь встречаемся в 16:00 по МСК в Яндекс телемост!))))
А то опять никто не придет😂😂😂
Приходите давайте)))😎
А то опять никто не придет😂😂😂
Приходите давайте)))
Please open Telegram to view this post
VIEW IN TELEGRAM
Ребят, спешу извиниться, но видео я сегодня не выложу, так как неизвестный ублюдок заспамил конец встречи 😡
Обработаю и завтра выложу.
Надеюсь на понимание🤙
Обработаю и завтра выложу.
Надеюсь на понимание
Please open Telegram to view this post
VIEW IN TELEGRAM
Collectors в Java
Collectors.toMap
Collectors.toMap – это мощный коллектор, преобразующий элементы потока в Map<K, V>, где ключи и значения вычисляются на основе элементов потока.
1. Базовая форма: toMap(keyMapper, valueMapper)
Преобразует поток в Map, где:
keyMapper – функция, вычисляющая ключ,
valueMapper – функция, вычисляющая значение.
Сигнатура:
Пример:
2. Обработка дубликатов: toMap(keyMapper, valueMapper, mergeFunction)
Если возможны повторяющиеся ключи, нужно указать mergeFunction – стратегию разрешения конфликтов.
Сигнатура:
Примеры:
2.1. Оставить старое значение
2.2. Объединить значения (например, конкатенация строк)
2.3. Суммирование значений при дублировании ключей
3. Выбор реализации Map: toMap(keyMapper, valueMapper, mergeFunction, mapFactory)
Позволяет указать конкретную реализацию Map (например, LinkedHashMap или TreeMap).
Сигнатура:
Примеры:
3.1. Сохранение порядка вставки (LinkedHashMap)
3.2. Сортировка по ключу (TreeMap)
#Java #Training #Medium #Collectors #CollectorsToMap
Collectors.toMap
Collectors.toMap – это мощный коллектор, преобразующий элементы потока в Map<K, V>, где ключи и значения вычисляются на основе элементов потока.
1. Базовая форма: toMap(keyMapper, valueMapper)
Преобразует поток в Map, где:
keyMapper – функция, вычисляющая ключ,
valueMapper – функция, вычисляющая значение.
Сигнатура:
public static <T, K, U> Collector<T, ?, Map<K, U>> toMap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper
)
Пример:
List<String> names = List.of("Alice", "Bob", "Charlie");
// Создаем Map: {имя -> длина строки}
Map<String, Integer> nameToLength = names.stream()
.collect(Collectors.toMap(
name -> name, // ключ – сама строка
name -> name.length() // значение – длина строки
));
// Результат: {"Alice":5, "Bob":3, "Charlie":7}
Что произойдет, если ключи повторяются?
→ Будет выброшено IllegalStateException!
2. Обработка дубликатов: toMap(keyMapper, valueMapper, mergeFunction)
Если возможны повторяющиеся ключи, нужно указать mergeFunction – стратегию разрешения конфликтов.
Сигнатура:
public static <T, K, U> Collector<T, ?, Map<K, U>> toMap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction
)
Примеры:
2.1. Оставить старое значение
List<String> names = List.of("Alice", "Bob", "Alice");
Map<String, Integer> nameToLength = names.stream()
.collect(Collectors.toMap(
name -> name,
name -> name.length(),
(oldValue, newValue) -> oldValue // при конфликте берем старое значение
));
// Результат: {"Alice":5, "Bob":3}
2.2. Объединить значения (например, конкатенация строк)
List<String> names = List.of("A", "B", "A", "C");
Map<String, String> mergedLetters = names.stream()
.collect(Collectors.toMap(
letter -> letter,
letter -> letter,
(oldVal, newVal) -> oldVal + newVal // "A" + "A" → "AA"
));
// Результат: {"A":"AA", "B":"B", "C":"C"}
2.3. Суммирование значений при дублировании ключей
record Product(String id, double price) {}
List<Product> products = List.of(
new Product("A", 10.0),
new Product("B", 20.0),
new Product("A", 15.0)
);
Map<String, Double> totalPriceById = products.stream()
.collect(Collectors.toMap(
Product::id,
Product::price,
Double::sum // 10.0 + 15.0 = 25.0
));
// Результат: {"A":25.0, "B":20.0}
3. Выбор реализации Map: toMap(keyMapper, valueMapper, mergeFunction, mapFactory)
Позволяет указать конкретную реализацию Map (например, LinkedHashMap или TreeMap).
Сигнатура:
public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapFactory
)
Примеры:
3.1. Сохранение порядка вставки (LinkedHashMap)
Map<String, Integer> orderedMap = names.stream()
.collect(Collectors.toMap(
name -> name,
name -> name.length(),
(oldVal, newVal) -> oldVal,
LinkedHashMap::new
));
3.2. Сортировка по ключу (TreeMap)
Map<String, Integer> sortedMap = names.stream()
.collect(Collectors.toMap(
name -> name,
name -> name.length(),
(oldVal, newVal) -> oldVal,
TreeMap::new
));
#Java #Training #Medium #Collectors #CollectorsToMap
4. Особенности и подводные камни
4.1. Null-ключи и Null-значения
HashMap допускает один null-ключ, но если keyMapper возвращает null – будет NullPointerException.
Если valueMapper возвращает null, значение в Map будет null.
4.2. Параллельные стримы
toMap не оптимизирован для параллельных операций.
Вместо него лучше использовать Collectors.toConcurrentMap.
4.3. Изменяемые ключи
Если ключ изменяется после добавления в Map, это может нарушить работу HashMap (ключи должны быть immutable).
5. Альтернативы
5.1. Collectors.toUnmodifiableMap (Java 10+)
Создает неизменяемую Map:
5.2. Collectors.toConcurrentMap
Оптимизирован для многопоточности:
#Java #Training #Medium #Collectors #CollectorsToMap
4.1. Null-ключи и Null-значения
HashMap допускает один null-ключ, но если keyMapper возвращает null – будет NullPointerException.
Если valueMapper возвращает null, значение в Map будет null.
4.2. Параллельные стримы
toMap не оптимизирован для параллельных операций.
Вместо него лучше использовать Collectors.toConcurrentMap.
4.3. Изменяемые ключи
Если ключ изменяется после добавления в Map, это может нарушить работу HashMap (ключи должны быть immutable).
5. Альтернативы
5.1. Collectors.toUnmodifiableMap (Java 10+)
Создает неизменяемую Map:
Map<String, Integer> unmodifiableMap = names.stream()
.collect(Collectors.toUnmodifiableMap(
name -> name,
name -> name.length()
));
5.2. Collectors.toConcurrentMap
Оптимизирован для многопоточности:
ConcurrentMap<String, Integer> concurrentMap = names.stream()
.collect(Collectors.toConcurrentMap(
name -> name,
name -> name.length()
));
#Java #Training #Medium #Collectors #CollectorsToMap
Что выведет код?
#Tasks
import java.util.*;
public class Task280425 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> subList = list.subList(1, 3);
subList.add(4);
System.out.println(list.size());
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM