На Java (или на любом подобном языке) как бы вы написали чистую функцию (или метод), которая удаляет элемент из списка.
Если элемент находится в списке, мы просто возвращаем новый (в идеале неизменяемый) список, содержащий все элементы входного списка за вычетом элемента, который мы удалили.
Но как бы вы поступили в случае, если элемент не найден в списке?
Предположим, что метод получает 2 параметра, list
и element
, которые нужно удалить:
public SOMETHING remove(final List<String> list, final String element){
// Copy the input list and remove the first occurrence of 'element', if I find it.
//
// if I don't find it ... do something clever here ...
}
Если я вызываю этот метод, а element
не содержится внутри list
:
- Вызов исключения предположительно сделает метод «нечистым» (?)
- Изменение списка ввода и возврат логического значения (аналогично List # remove ()) предположительно сделает метод" нечистым "(изменение ввода будет побочным эффектом)
- Если бы я вызывал этот метод, мне показалось бы, что возвращать входные данные в качестве выходных данных не интуитивно.
- вернуть
Optional.of(listCopy)
(РЕДАКТИРОВАТЬ: добавлен в мой вопрос после его публикации) - Есть другие идеи?
РЕДАКТИРОВАТЬ
Я должен был упомянуть, что я хочу удалить только первое вхождение element
, поэтому, если вход list
имеет несколько вхождений element
, я не хочу удалять их все с помощью sigle-вызова моего метода remove () (например, используя stream().filter()
). Я только что отредактировал комментарий в моем примере кода, чтобы отразить это. Однако это не полностью относится к моему вопросу, так как мой главный вопрос вращается вокруг того, как сделать метод интуитивно понятным для использования И оставаться «чистым».
РЕДАКТИРОВАТЬ 2
Я добавил дополнительную идею к приведенным выше предложениям. Возврат Optional.of(listCopy)
кажется самым элегантным решением из предложенных до сих пор. Он заставляет вызывающего пользователя проверить, была ли запрошенная операция успешной или нет, И (если она была успешной), он возвращает новый список, тем самым не изменяя исходный список ввода. Если операция завершилась неудачно (element
не было найдено внутри list
), метод возвращает Optional.empty()
. Мне кажется, это также обеспечит указанную ниже ссылочную целостность.