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
71
72
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
81
82
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 }