it-swarm.com.ru

Коллекция для потоковой передачи в новую коллекцию

Я ищу самый безболезненный способ фильтрации коллекции. Я думаю что-то вроде

Collection<?> foo = existingCollection.stream().filter( ... ). ...

Но я не уверен, как лучше перейти от фильтра к возвращению или заполнению другой коллекции. Большинство примеров похоже на "и здесь вы можете напечатать". Возможно, есть конструктор или метод вывода, который мне не хватает.

46
xenoterracide

Есть причина, по которой большинство примеров избегают сохранения результата в Collection. Это не рекомендуемый способ программирования. У вас уже есть Collection, тот, который предоставляет исходные данные и коллекции, сам по себе бесполезен. Вы хотите выполнить на нем определенные операции, поэтому в идеальном случае вам нужно выполнить операцию с использованием потока и пропустить сохранение данных в промежуточном Collection. Это то, что большинство примеров пытаются предложить.

Конечно, существует множество существующих API, работающих с Collections, и так будет всегда. Таким образом, API Stream предлагает различные способы обработки спроса на Collection.

  • Получить произвольную реализацию List, содержащую результат:

    _List<T> results = l.stream().filter(…).collect(Collectors.toList());
    _
  • Получить произвольную реализацию Set, содержащую результат:

    _Set<T> results = l.stream().filter(…).collect(Collectors.toSet());
    _
  • Получить конкретный Collection:

    _ArrayList<T> results =
      l.stream().filter(…).collect(Collectors.toCollection(ArrayList::new));
    _
  • Добавить к существующему Collection:

    _l.stream().filter(…).forEach(existing::add);
    _
  • Создать массив:

    _String[] array=l.stream().filter(…).toArray(String[]::new);
    _
  • Используйте массив для создания списка с определенным специфическим поведением (изменяемый, фиксированный размер):

    _List<String> al=Arrays.asList(l.stream().filter(…).toArray(String[]::new));
    _
  • Разрешить добавление параллельного потока во временные локальные списки и последующее присоединение к ним:

    _List<T> results
      = l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll);
    _

    (Примечание: это тесно связано с тем, как в настоящее время реализуется Collectors.toList(), но это деталь реализации, то есть нет гарантии, что будущие реализации сборщиков toList() по-прежнему будут возвращать ArrayList)

114
Holger

Пример из документации _Java.util.stream_:

_List<String>results =
     stream.filter(s -> pattern.matcher(s).matches())
           .collect(Collectors.toList());
_

Collectors имеет метод toCollection(), я бы посоветовал посмотреть так.

4
Samy Dindane