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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Когда сдача таски через 2 часа, а ты не даже начинал 😆

https://t.me/Java_for_beginner_dev

#Mems
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
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 – функция, вычисляющая значение.


Сигнатура:
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:

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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
7%
2
44%
3
33%
4
15%
Exception какой-то
И ведь всегда так 😡 😁

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM