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
68
69
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
78
79
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 }