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 шт):
Буквальный перевод:
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().