View Javadoc

1   package com.atlassian.plugin.util.collect;
2   
3   import java.util.ArrayList;
4   import java.util.Collection;
5   import java.util.Collections;
6   import java.util.Comparator;
7   import java.util.Iterator;
8   import java.util.List;
9   
10  public class CollectionUtil
11  {
12  
13      public static <T> void foreach(final Iterator<T> iterator, final Consumer<T> sink)
14      {
15          while (iterator.hasNext())
16          {
17              sink.consume(iterator.next());
18          }
19      }
20  
21      public static <T> void foreach(final Iterable<T> iterable, final Consumer<T> sink)
22      {
23          if (iterable != null)
24          {
25              foreach(iterable.iterator(), sink);
26          }
27      }
28  
29      public static <T> List<T> toList(final Iterable<T> iterable)
30      {
31          return toList(iterable.iterator());
32      }
33  
34      public static <T> List<T> toList(final Iterator<T> iterator)
35      {
36          final List<T> result = new ArrayList<T>();
37          foreach(iterator, new Consumer<T>()
38          {
39              public void consume(final T element)
40              {
41                  if (element != null)
42                  {
43                      result.add(element);
44                  }
45              }
46          });
47          return result;
48      }
49  
50      public static <T, R> List<R> transform(final Iterator<T> iterator, final Function<T, R> transformer)
51      {
52          return toList(transformIterator(iterator, transformer));
53      }
54  
55      public static <T, R> List<R> transform(final Iterable<T> iterable, final Function<T, R> transformer)
56      {
57          if (iterable == null)
58          {
59              return Collections.emptyList();
60          }
61          return transform(iterable.iterator(), transformer);
62      }
63  
64      public static <T, R> Iterator<R> transformIterator(final Iterator<T> iterator, final Function<T, R> transformer)
65      {
66          return new TransformingIterator<T, R>(iterator, transformer);
67      }
68  
69      /**
70       * Create a filtered {@link Iterator}.
71       * @param <T>
72       * @return
73       */
74      public static <T> Iterator<T> filter(final Iterator<T> iterator, final Predicate<T> predicate)
75      {
76          return new FilteredIterator<T>(iterator, predicate);
77      }
78  
79      /**
80       * Create a filtered {@link Iterator}.
81       * @param <T>
82       * @return
83       */
84      public static <T> Iterable<T> filter(final Iterable<T> iterable, final Predicate<T> predicate)
85      {
86          return new FilteredIterable<T>(iterable, predicate);
87      }
88  
89      static class FilteredIterable<T> implements Iterable<T>
90      {
91          private final Iterable<T> delegate;
92          private final Predicate<T> predicate;
93  
94          FilteredIterable(final Iterable<T> delegate, final Predicate<T> predicate)
95          {
96              this.delegate = delegate;
97              this.predicate = predicate;
98          }
99  
100         public Iterator<T> iterator()
101         {
102             return new FilteredIterator<T>(delegate.iterator(), predicate);
103         }
104 
105         @Override
106         public String toString()
107         {
108             return toList(this).toString();
109         }
110     }
111 
112     public static <T> List<T> sort(final Collection<T> collection, final Comparator<T> comparator)
113     {
114         final List<T> sorted = new ArrayList<T>(collection);
115         if (sorted.size() > 1)
116         {
117             Collections.sort(sorted, comparator);
118         }
119         return sorted;
120     }
121 }