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 шт):

Автор решения: Alex Rudenko

Основная проблема в показанном коде - некорректное сравнение объектов 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));
→ Ссылка