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...
 
                                             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
     
         
                 
                 
                 
                 
                 
                 
                 
                 
                