// List-based generic reduction with wildcard type - Page 136
package org.effectivejava.examples.chapter05.item28;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Reduction {
// Wildcard type for parameter that serves as an E producer
static <E> E reduce(List<? extends E> list, Function<E> f, E initVal) {
List<E> snapshot;
synchronized (list) {
snapshot = new ArrayList<E>(list);
}
E result = initVal;
for (E e : snapshot)
result = f.apply(result, e);
return result;
}
private static final Function<Number> MAX = new Function<Number>() {
public Number apply(Number n1, Number n2) {
return Double.compare(n1.doubleValue(), n2.doubleValue()) > 0 ? n1
: n2;
}
};
public static void main(String[] args) {
// We can use a Number functionto reduce a list of Integer or Double
List<Integer> intList = Arrays.asList(2, 7, 1, 8, 2, 8, 1, 8, 2, 8);
System.out.println(reduce(intList, MAX, Integer.MIN_VALUE));
List<Double> doubleList = Arrays.asList(2.718281828, 3.141592654,
1.61803399);
System.out.println(reduce(doubleList, MAX, Double.NEGATIVE_INFINITY));
}
}