View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.collections4.iterators;
19  
20  import java.util.ArrayList;
21  import java.util.Collection;
22  import java.util.HashSet;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Set;
26  import java.util.function.Supplier;
27  
28  /**
29   * Extends {@link Iterator} with additional default methods.
30   *
31   * @param <E> the type of elements returned by this iterator.
32   * @since 4.5.0-M3
33   */
34  public interface IteratorOperations<E> extends Iterator<E> {
35  
36      /**
37       * Adds the remaining elements in the iterator to an arbitrary {@link Collection}. This method consumes the iterator.
38       *
39       * @param collection The target collection to add elements to.
40       * @return the given {@code collection}.
41       * @param <C> A collection of objects of type {@code <E>}.
42       */
43      default <C extends Collection<E>> C addTo(final C collection) {
44          forEachRemaining(collection::add);
45          return collection;
46      }
47  
48      /**
49       * Returns the next item and removes it from the iterator.
50       *
51       * @return the next item from the iterator.
52       */
53      default E removeNext() {
54          final E result = next();
55          remove();
56          return result;
57      }
58  
59      /**
60       * Adds the remaining elements in the iterator to a new {@link Collection} provided by the supplier. This method consumes the iterator.
61       *
62       * @param collectionSupplier supplies a collection target.
63       * @param <C> the collection type.
64       * @return a new Collection containing the remaining elements of this instance.
65       */
66      default <C extends Collection<E>> C toCollection(final Supplier<C> collectionSupplier) {
67          return addTo(collectionSupplier.get());
68      }
69  
70      /**
71       * Adds the remaining elements in the iterator to a new {@link List}. This method consumes the iterator.
72       *
73       * @return a new List containing the remaining elements of this instance.
74       */
75      default List<E> toList() {
76          return toCollection(ArrayList::new);
77      }
78  
79      /**
80       * Adds the remaining elements in the iterator to a new {@link Set}. This method consumes the iterator.
81       *
82       * @return a new Set containing the remaining elements of this instance.
83       */
84      default Set<E> toSet() {
85          return toCollection(HashSet::new);
86      }
87  
88  }