Изменить list объектов

Рейтинг: -2Ответов: 2Опубликовано: 16.01.2023
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.

Ответы

▲ 1Принят

Так себе задача для стримов, но можно , к примеру, так:

List<WorkerInfo> result = list.stream()
        .peek(w->w.getWorker().setError(w.getWorker().getSalary()==null ? "Зарплата не установлена" : ""))
        .collect(Collectors.toList());
▲ 0

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() ? "Зарплата не установлена" : ""
));