В какие коллекции можно собрать элементы Java Stream?

«В какие коллекции можно собрать элементы Java Stream?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Элементы Stream можно собрать в стандартные и кастомные коллекции с помощью статических методов класса Collectors.

Основные коллекторы:

  1. В стандартные неизменяемые коллекции:

    List<String> list = stream.collect(Collectors.toList());
    Set<String> set = stream.collect(Collectors.toSet());
  2. В конкретную реализацию: Используйте Collectors.toCollection(Supplier), чтобы указать конкретный тип.

    // В LinkedList
    LinkedList<String> linkedList = stream.collect(
        Collectors.toCollection(LinkedList::new)
    );
    // В TreeSet
    TreeSet<String> treeSet = stream.collect(
        Collectors.toCollection(TreeSet::new)
    );
  3. В Map: Используйте Collectors.toMap() или Collectors.groupingBy().

    // toMap: ключ, значение
    Map<String, Integer> map = stream.collect(
        Collectors.toMap(s -> s, String::length)
    );
    // groupingBy: группировка по критерию
    Map<Integer, List<String>> mapByLength = stream.collect(
        Collectors.groupingBy(String::length)
    );
  4. В неизменяемые (unmodifiable) коллекции (Java 10+):

    List<String> unmodifiableList = stream.collect(Collectors.toUnmodifiableList());
    Set<String> unmodifiableSet = stream.collect(Collectors.toUnmodifiableSet());
    Map<String, Integer> unmodifiableMap = stream.collect(
        Collectors.toUnmodifiableMap(s -> s, String::length)
    );

Почему toCollection? Методы toList() и toSet() не гарантируют тип возвращаемой реализации (это может быть ArrayList или HashSet). toCollection() дает полный контроль.