Stream API Java удаление и обновление элемента в коллекции
Пробую делать задание, я только на стадии изучения API, пытаюсь сделать удаление элемента с коллекции и обновление. Есть такой класс с полями
public class Worker{
private String name;
private int id;
private int salary;
private String position;
//геттеры и сеттеры
}
Есть методы
public void changeSalary(String name, Integer salary) {
//Implement updating workers you see fit.
}
public void fireWorker(String name) {
//Implement deleting workers by name.
}
Удаление пробовала сделать так, но оба варианта не проходят, сказали не все. Не знаю что добавить. А как сделать обновление элемента не могу придумать.
Collection<Worker> collection = Arrays.asList();
collection.stream().dropWhile(s -> Objects.equals(s,"Adam N"))
.collect(Collectors.toList());
/////////// другой вариант
Collection<Worker> collection = Arrays.asList();
collection.stream()
.filter(str -> !Objects.equals(str,"Adam N"));
.collect(Collectors.toList());
Ответы (1 шт):
Основная проблема в показанном коде - некорректное сравнение объектов Worker, которые содержатся в Stream<Worker> со строковой константой "Adam N".
Для удаления элементов из коллекции существует метод Collection::removeIf принимающий предикат:
Collection<Worker> collection = Arrays.asList();
collection.removeIf(worker -> "Adam N".equalsIgnoreCase(worker.getName()));
Или же следует применять предикат в .filter, если нужно получить копию списка без удалённого сотрудника:
Collection<Worker> noAdam = collection
.stream()
.filter(worker -> !Objects.equals("Adam N", worker.getName()))
.collect(Collectors.toList());
Для обновления элемента в списке следует корректно применить .filter, а затем использовать forEach:
collection
.stream()
.filter(worker -> Objects.equals("Eva F", worker.getName()))
.forEach(worker -> worker.setSalary(1_000));