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  package org.apache.commons.collections4.iterators;
18  
19  import java.util.Iterator;
20  
21  import org.apache.commons.collections4.Transformer;
22  
23  /**
24   * Decorates an iterator such that each element returned is transformed.
25   *
26   * @param <I> the type of the input to the function.
27   * @param <O> the type of the result of the function.
28   * @since 1.0
29   */
30  public class TransformIterator<I, O> implements Iterator<O> {
31  
32      /** The iterator being used */
33      private Iterator<? extends I> iterator;
34      /** The transformer being used */
35      private Transformer<? super I, ? extends O> transformer;
36  
37      /**
38       * Constructs a new {@code TransformIterator} that will not function
39       * until the {@link #setIterator(Iterator) setIterator} and
40       * {@link #setTransformer(Transformer)} methods are invoked.
41       */
42      public TransformIterator() {
43      }
44  
45      /**
46       * Constructs a new {@code TransformIterator} that won't transform
47       * elements from the given iterator.
48       *
49       * @param iterator  the iterator to use
50       */
51      public TransformIterator(final Iterator<? extends I> iterator) {
52          this.iterator = iterator;
53      }
54  
55      /**
56       * Constructs a new {@code TransformIterator} that will use the
57       * given iterator and transformer.  If the given transformer is null,
58       * then objects will not be transformed.
59       *
60       * @param iterator  the iterator to use
61       * @param transformer  the transformer to use
62       */
63      public TransformIterator(final Iterator<? extends I> iterator,
64                               final Transformer<? super I, ? extends O> transformer) {
65          this.iterator = iterator;
66          this.transformer = transformer;
67      }
68  
69      /**
70       * Gets the iterator this iterator is using.
71       *
72       * @return the iterator.
73       */
74      public Iterator<? extends I> getIterator() {
75          return iterator;
76      }
77  
78      /**
79       * Gets the transformer this iterator is using.
80       *
81       * @return the transformer.
82       */
83      public Transformer<? super I, ? extends O> getTransformer() {
84          return transformer;
85      }
86  
87      @Override
88      public boolean hasNext() {
89          return iterator.hasNext();
90      }
91  
92      /**
93       * Gets the next object from the iteration, transforming it using the
94       * current transformer. If the transformer is null, no transformation
95       * occurs and the object from the iterator is returned directly.
96       *
97       * @return the next object
98       * @throws java.util.NoSuchElementException if there are no more elements
99       */
100     @Override
101     public O next() {
102         return transform(iterator.next());
103     }
104 
105     @Override
106     public void remove() {
107         iterator.remove();
108     }
109 
110     /**
111      * Sets the iterator for this iterator to use.
112      * If iteration has started, this effectively resets the iterator.
113      *
114      * @param iterator  the iterator to use
115      */
116     public void setIterator(final Iterator<? extends I> iterator) {
117         this.iterator = iterator;
118     }
119 
120     /**
121      * Sets the transformer this the iterator to use.
122      * A null transformer is a no-op transformer.
123      *
124      * @param transformer  the transformer to use
125      */
126     public void setTransformer(final Transformer<? super I, ? extends O> transformer) {
127         this.transformer = transformer;
128     }
129 
130     /**
131      * Transforms the given object using the transformer.
132      * If the transformer is null, the original object is returned as-is.
133      *
134      * @param source  the object to transform
135      * @return the transformed object
136      */
137     protected O transform(final I source) {
138         return transformer.apply(source);
139     }
140 }