198. Extending Stream with removeAll() and retainAll()
Before reading this problem, I strongly recommend that you read Problem 197.
In Problem 197, we extended the Stream API with two final operations named containsAll()
and containsAny()
via a custom interface. In both cases, the resulting interface was named Streams
. In this problem, we follow the same logic to implement two intermediate operations, named removeAll()
and retainAll()
, with the following signatures:
Streams<T> remove(T item);
Streams<T> removeAll(T... items);
Streams<T> removeAll(List<? extends T> items);
Streams<T> removeAll(Stream<? extends T> items);
Streams<T> retainAll(T... items);
Streams<T> retainAll(List<? extends T> items);
Streams<T> retainAll(Stream<? extends T> items);
Since removeAll()
and retainAll()
are intermediate operations, they have to return Stream
. More precisely, they have to return Streams
, which is our implementation...