Изменить list объектов
public class WorkerInfo {
privat Worker worker;
// геттеры и сеттеры
}
public class Worker {
privat Long id;
privat String name;
privat Double salary;
privat String error;
// геттеры и сеттеры
}
На вход поступает List <WorkerInfo> необходимо проверить поле salary, если оно null, то устанавливаем в поле error значение "Зарплата не установлена" иначе error равно "". Циклом я это сделал, не получается сделать через Stream API.
Ответы (2 шт):
Так себе задача для стримов, но можно , к примеру, так:
List<WorkerInfo> result = list.stream()
.peek(w->w.getWorker().setError(w.getWorker().getSalary()==null ? "Зарплата не установлена" : ""))
.collect(Collectors.toList());
Stream API не совсем подходит для решения данной задачи, так как она подразумевает изменение (мутацию) содержимого списка, то есть использование побочного эффекта в операции Stream::peek или даже Stream::forEach в общем случае крайне не рекомендуется, так как операции над стримами должны "не вмешиваться" в источник стрима и не зависеть от состояния стрима (каждый элемент стрима не зависит от какого-либо другого):
Most stream operations accept parameters that describe user-specified behavior... To preserve correct behavior, these behavioral parameters:
- must be non-interfering (they do not modify the stream source);
- and in most cases must be stateless (their result should not depend on any state that might change during execution of the stream pipeline)._
Однако есть возможность применить метод родительского интерфейса Iterable::forEach, предназначенный для подобного рода задач, так как здесь используется итератор в функциональном стиле:
list.forEach(wi -> wi.getWorker().setError(
null == wi.getWorker().getSalary() ? "Зарплата не установлена" : ""
));