В то время как мой другой ответ определенно является способом, который я рекомендую продолжить, @Hadi также предоставил альтернативу «потока», которая также действительна. Я решил поэкспериментировать с разными способами достижения того же результата, используя функции JDK-8.
В JDK-9 есть методы takeWhile и dropWhile , где первый возвращает поток, состоящий из самого длинного префикса элементов, взятых из потока, которые соответствуют данному предикату.
Последний возвращает поток, состоящий из оставшихся элементов данного потока после удаления самого длинного префикса элементов, соответствующих данному предикату.
Идея состоит в том, чтобы потреблять элементы, в то время как они не равны elementToRemove
:
integers.stream()
.takeWhile(e -> !Objects.equals(e, elementToRemove))
и отбросьте элементы, пока они не равны elementToRemove
и skip(1)
, чтобы исключить elementToRemove
:
integers.stream()
.dropWhile(e -> !Objects.equals(e, elementToRemove))
.skip(1)
, следовательно, дает два потока, где первый поток - это все предшествующие числа до elementToRemove
, а второй поток плюс skip(1)
- это все элементы после elementToRemove
, тогда мы просто объединяем их и собираем в реализацию списка.
List<Integer> result = Stream.concat(integers.stream()
.takeWhile(e -> !Objects.equals(e, elementToRemove)),
integers.stream()
.dropWhile(e -> !Objects.equals(e, elementToRemove))
.skip(1))
.collect(Collectors.toList());
Если элемент для удаления не существует в списке, takeWhile
будет использовать все элементы, а dropWhile
отбросит все элементы, и когда мы объединим эти два потока, мы вернем исходные элементы.
В целом это даст тот же результат, что и другие ответы.
Однако не используют это решение в рабочем коде , так как это неоптимально и не очевидно для глаз, что делает код. это только здесь, чтобы показать различные способы выполнить указанное требование.