Stream вместо foreach

Пытаюсь реализовать добавление объектов, получаемых из storage по id в список не через цикл, а с помощью stream, пока не очень получается.

Storage storage;
Set<Long> resultIds = new HashSet<>();
Set<Object> result = new HashSet<>();
 
for (var id : resultIds) {
    result.add(storage.getObject(id).get());
}
//так не работает
result.stream().collect(object -> storage.getObject(id -> resultIds.forEach()).get());

Вроде бы просто все - добавляем в список result все объекты, полученные по id из списка resultIds из storage, а в stream не работает...


Ответы (1 шт):

Автор решения: insolor

Буквальный перевод:

result = resultIds.stream()
    .map(id -> storage.getObject(id).get())
    .collect(Collectors.toSet());
  • .stream() нужно вызывать не от результата, а от исходных данных, которые обрабатываем (у вас это набор id-шников).

  • В map пишем лямбду, которая по id получает нужный объект - по сути это просто внутренняя часть из строки result.add(storage.getObject(id).get());.

    Аргументом метода .map() должна быть функция, которая преобразовывает элемент исходной последовательности в элемент новой последовательности.

  • Дальше все элементы собираем (.collect()) в нужную структуру данных - у вас это Set, значит используем коллектор Collectors.toSet().

→ Ссылка