A
public static <T> Pair<T, T> findMinMax(
Stream<? extends T> stream,
Comparator<? super T> order, Pair<T, T> identity) {
return stream.reduce(
identity,
(pair, t) -> {
T min = order.compare(pair.getKey(), t) < 0 ? pair.getKey() : t;
T max = order.compare(pair.getValue(), t) > 0 ? pair.getValue() : t;
return new Pair<>(min, max);
},
(p1, p2) -> {
T min = order.compare(p1.getKey(), p2.getKey()) < 0 ? p2.getKey() : p1.getKey();
T max = order.compare(p1.getValue(), p2.getValue()) > 0 ? p1.getValue() : p1.getValue();
return new Pair<>(min, max);
}
);
}
Some kind of nightmare. ♪public static void main(String[] args) {
Pair<Integer, Integer> identity = new Pair<>(Integer.MAX_VALUE, Integer.MIN_VALUE);
Stream<Integer> s = Stream.of(1,2,3,4,5,6,7,8,9,10);
Comparator<Integer> comp = (Integer o1, Integer o2) -> o1.compare(o1, o2);
Pair<Integer, Integer> p = Example.findMinMax(s, comp, identity);
System.out.println(p); // 1..10
}
PS: Alternative implementation without identity on @TagirValeev :public static <T> Pair<T, T> findMinMax(
Stream<? extends T> stream,
Comparator<? super T> order) {
return stream.reduce(
null,
(pair, t) -> {
if (pair == null) return new Pair<>(t,t);
T min = order.compare(pair.getKey(), t) < 0 ? pair.getKey() : t;
T max = order.compare(pair.getValue(), t) > 0 ? pair.getValue() : t;
return new Pair<>(min, max);
},
(p1, p2) -> {
if (p1 == null) return p2;
if (p2 == null) return p1;
T min = order.compare(p1.getKey(), p2.getKey()) < 0 ? p2.getKey() : p1.getKey();
T max = order.compare(p1.getValue(), p2.getValue()) > 0 ? p1.getValue() : p1.getValue();
return new Pair<>(min, max);}
);
}