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                  result.add(element);
42              };
43          });
44          return result;
45      }
46  
47      public static <T, R> List<R> transform(final Iterator<T> iterator, final Function<T, R> transformer)
48      {
49          return toList(transformIterator(iterator, transformer));
50      }
51  
52      public static <T, R> List<R> transform(final Iterable<T> iterable, final Function<T, R> transformer)
53      {
54          if (iterable == null)
55          {
56              return Collections.emptyList();
57          }
58          return transform(iterable.iterator(), transformer);
59      }
60  
61      public static <T, R> Iterator<R> transformIterator(final Iterator<T> iterator, final Function<T, R> transformer)
62      {
63          return new TransformingIterator<T, R>(iterator, transformer);
64      }
65  
66      /**
67       * Create a filtered {@link Iterator}.
68       * @param <T>
69       * @return
70       */
71      public static <T> Iterator<T> filter(final Iterator<T> iterator, final Predicate<T> predicate)
72      {
73          return new FilteredIterator<T>(iterator, predicate);
74      }
75  
76      /**
77       * Create a filtered {@link Iterator}.
78       * @param <T>
79       * @return
80       */
81      public static <T> Iterable<T> filter(final Iterable<T> iterable, final Predicate<T> predicate)
82      {
83          return new FilteredIterable<T>(iterable, predicate);
84      }
85  
86      static class FilteredIterable<T> implements Iterable<T>
87      {
88          private final Iterable<T> delegate;
89          private final Predicate<T> predicate;
90  
91          FilteredIterable(final Iterable<T> delegate, final Predicate<T> predicate)
92          {
93              this.delegate = delegate;
94              this.predicate = predicate;
95          }
96  
97          public Iterator<T> iterator()
98          {
99              return new FilteredIterator<T>(delegate.iterator(), predicate);
100         }
101 
102         @Override
103         public String toString()
104         {
105             return toList(this).toString();
106         }
107     }
108 
109     public static <T> List<T> sort(final Collection<T> collection, final Comparator<T> comparator)
110     {
111         final List<T> sorted = new ArrayList<T>(collection);
112         if (sorted.size() > 1)
113         {
114             Collections.sort(sorted, comparator);
115         }
116         return sorted;
117     }
118 }