Javolution 6.0.0 java
Reducers.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.util.function;
10 
11 import static javolution.lang.Realtime.Limit.LINEAR;
12 
13 import java.util.Collection;
14 import java.util.Comparator;
15 import java.util.Iterator;
16 import java.util.concurrent.atomic.AtomicInteger;
17 import java.util.concurrent.atomic.AtomicReference;
18 
20 import javolution.lang.Realtime;
22 
30 public class Reducers {
31 
32  // Utility class, no default constructor.
33  private Reducers() {}
34 
41  @Realtime(limit = LINEAR)
42  public static <E> Reducer<E> any(Class<? extends E> type) {
43  return new AnyReducer<E>(type);
44  }
45 
46  private static class AnyReducer<E> implements Reducer<E> {
47  private final Class<? extends E> type;
48  private volatile E found;
49 
50  public AnyReducer(Class<? extends E> type) {
51  this.type = type;
52  }
53 
54  @Override
55  public void accept(Collection<E> param) {
56  Iterator<E> it = param.iterator();
57  while (it.hasNext() && (found == null)) {
58  E e = it.next();
59  if (type.isInstance(e)) {
60  found = e;
61  break;
62  }
63  }
64  }
65 
66  @Override
67  public E get() {
68  return found;
69  }
70  }
71 
78  @Parallelizable(mutexFree = true, comment = "Internal use of AtomicReference")
79  @Realtime(limit = LINEAR)
80  public static <E> Reducer<E> max(Comparator<? super E> comparator) {
81  return new MaxReducer<E>(comparator);
82  }
83 
84  private static class MaxReducer<E> implements Reducer<E> {
85  private final Comparator<? super E> cmp;
86  private final AtomicReference<E> max = new AtomicReference<E>(null);
87 
88  public MaxReducer(Comparator<? super E> cmp) {
89  this.cmp = cmp;
90  }
91 
92  @Override
93  public void accept(Collection<E> param) {
94  Iterator<E> it = param.iterator();
95  while (it.hasNext()) {
96  E e = it.next();
97  E read = max.get();
98  while ((read == null) || (cmp.compare(e, read) > 0)) {
99  if (max.compareAndSet(read, e)) break;
100  read = max.get();
101  }
102  }
103  }
104 
105  @Override
106  public E get() {
107  return max.get();
108  }
109  }
110 
115  @Parallelizable(mutexFree = true, comment = "Internal use of AtomicReference")
116  @Realtime(limit = LINEAR)
117  public static <E> Reducer<E> min(Comparator<? super E> comparator) {
118  return new MinReducer<E>(comparator);
119  }
120 
121  private static class MinReducer<E> implements Reducer<E> {
122  private final Comparator<? super E> cmp;
123  private final AtomicReference<E> min = new AtomicReference<E>(null);
124 
125  public MinReducer(Comparator<? super E> cmp) {
126  this.cmp = cmp;
127  }
128 
129  @Override
130  public void accept(Collection<E> param) {
131  Iterator<E> it = param.iterator();
132  while (it.hasNext()) {
133  E e = it.next();
134  E read = min.get();
135  while ((read == null) || (cmp.compare(e, read) < 0)) {
136  if (min.compareAndSet(read, e)) break;
137  read = min.get();
138  }
139  }
140  }
141 
142  @Override
143  public E get() {
144  return min.get();
145  }
146  }
147 
154  @Realtime(limit = LINEAR)
155  public static Reducer<Boolean> and() {
156  return new AndReducer();
157  }
158 
159  private static class AndReducer implements Reducer<Boolean> {
160  volatile boolean result = true;
161 
162  @Override
163  public void accept(Collection<Boolean> param) {
164  Iterator<Boolean> it = param.iterator();
165  while (result && it.hasNext()) {
166  if (!it.next()) result = false;
167  }
168  }
169 
170  @Override
171  public Boolean get() {
172  return result;
173  }
174  }
175 
182  @Realtime(limit = LINEAR)
183  public static Reducer<Boolean> or() {
184  return new OrReducer();
185  }
186 
187  private static class OrReducer implements Reducer<Boolean> {
188  volatile boolean result = false;
189 
190  @Override
191  public void accept(Collection<Boolean> param) {
192  Iterator<Boolean> it = param.iterator();
193  while (!result && it.hasNext()) {
194  if (!it.next()) result = true;
195  }
196  }
197 
198  @Override
199  public Boolean get() {
200  return result;
201  }
202  }
203 
208  @Parallelizable(comment = "Internal use of AtomicInteger")
209  @Realtime(limit = LINEAR)
210  public static Reducer<Integer> sum() {
211  return new SumReducer();
212  }
213 
214  private static class SumReducer implements Reducer<Integer> {
215  private final AtomicInteger sum = new AtomicInteger(0);
216 
217  @Override
218  public void accept(Collection<Integer> param) {
219  Iterator<Integer> it = param.iterator();
220  while (it.hasNext()) {
221  sum.getAndAdd(it.next().intValue());
222  }
223  }
224 
225  @Override
226  public Integer get() {
227  return sum.get();
228  }
229  }
230 
231 }
javolution.util.function.Reducers.MaxReducer.cmp
final Comparator<? super E > cmp
Definition: Reducers.java:85
javolution.lang.Parallelizable
Definition: Parallelizable.java:55
javolution
javolution.lang.Realtime.Limit
Definition: Realtime.java:81
javolution.util.function.Reducers.MinReducer
Definition: Reducers.java:121
javolution.util.function.Reducers.MinReducer.MinReducer
MinReducer(Comparator<? super E > cmp)
Definition: Reducers.java:125
javolution.util.function.Reducers.SumReducer.sum
final AtomicInteger sum
Definition: Reducers.java:215
javolution.util.function.Reducers.max
static< E > Reducer< E > max(Comparator<? super E > comparator)
Definition: Reducers.java:80
javolution.util.function.Reducers.MaxReducer.max
final AtomicReference< E > max
Definition: Reducers.java:86
javolution.util.function.Reducers.MaxReducer.accept
void accept(Collection< E > param)
Definition: Reducers.java:93
javolution.util.function.Reducers.MinReducer.min
final AtomicReference< E > min
Definition: Reducers.java:123
javolution.util.function.Reducers.AnyReducer.found
volatile E found
Definition: Reducers.java:48
javolution.util.function.Reducers.SumReducer.accept
void accept(Collection< Integer > param)
Definition: Reducers.java:218
javolution.util.function.Reducers.AndReducer
Definition: Reducers.java:159
javolution.lang
Definition: Configurable.java:9
javolution.util.function.Reducers.OrReducer.accept
void accept(Collection< Boolean > param)
Definition: Reducers.java:191
javolution.util.function.Reducers.AndReducer.result
volatile boolean result
Definition: Reducers.java:160
javolution.util.function.Reducers.sum
static Reducer< Integer > sum()
Definition: Reducers.java:210
javolution.util.function.Reducers.OrReducer.result
volatile boolean result
Definition: Reducers.java:188
javolution.util.function.Reducers.min
static< E > Reducer< E > min(Comparator<? super E > comparator)
Definition: Reducers.java:117
javolution.util.function.Reducers.SumReducer
Definition: Reducers.java:214
javolution.util.function.Reducers.AnyReducer
Definition: Reducers.java:46
javolution.lang.Realtime.Limit.LINEAR
LINEAR
Definition: Realtime.java:98
javolution.lang.Realtime
Definition: Realtime.java:59
javolution.util.function.Reducers.MaxReducer
Definition: Reducers.java:84
javolution.util.function.Reducers.any
static< E > Reducer< E > any(Class<? extends E > type)
Definition: Reducers.java:42
javolution.util.function.Reducers.MinReducer.accept
void accept(Collection< E > param)
Definition: Reducers.java:130
javolution.util.function.Reducers
Definition: Reducers.java:30
javolution.util.function.Reducers.MaxReducer.MaxReducer
MaxReducer(Comparator<? super E > cmp)
Definition: Reducers.java:88
javolution.util.FastCollection
Definition: FastCollection.java:166
javolution.util.function.Reducers.AnyReducer.accept
void accept(Collection< E > param)
Definition: Reducers.java:55
javolution.util.function.Reducers.AndReducer.accept
void accept(Collection< Boolean > param)
Definition: Reducers.java:163
javolution.util.function.Reducers.AnyReducer.type
final Class<? extends E > type
Definition: Reducers.java:47
javolution.util.function.Reducers.OrReducer
Definition: Reducers.java:187
javolution.util.function.Reducers.and
static Reducer< Boolean > and()
Definition: Reducers.java:155
javolution.util.function.Reducers.AnyReducer.AnyReducer
AnyReducer(Class<? extends E > type)
Definition: Reducers.java:50
javolution.util.function.Reducers.MinReducer.cmp
final Comparator<? super E > cmp
Definition: Reducers.java:122
javolution.util
Definition: FastBitSet.java:9
javolution.util.function.Reducers.or
static Reducer< Boolean > or()
Definition: Reducers.java:183
javolution.util.function.Reducers.Reducers
Reducers()
Definition: Reducers.java:33
javolution.util.function.Reducer
Definition: Reducer.java:24