package com.annimon.stream.function; import com.annimon.stream.Objects; import java.util.Comparator; /** * Represents an operation on two operands that produces a result of the * same type as its operand. * * @param <T> the type of the operands and result of the operator */ @FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T, T, T> { class Util { private Util() { } /** * Returns a {@code BinaryOperator} which returns lesser of two elements * according to the specified {@code Comparator}. * * @param <T> the type of the input arguments of the comparator * @param comparator a {@code Comparator} for comparing the two values * @return a {@code BinaryOperator} which returns the lesser of its operands, * according to the supplied {@code Comparator} * @throws NullPointerException if the argument is null */ public static <T> BinaryOperator<T> minBy(final Comparator<? super T> comparator) { Objects.requireNonNull(comparator); return new BinaryOperator<T>() { @Override public T apply(T a, T b) { return comparator.compare(a, b) <= 0 ? a : b; } }; } /** * Returns a {@code BinaryOperator} which returns greater of two elements * according to the specified {@code Comparator}. * * @param <T> the type of the input arguments of the comparator * @param comparator a {@code Comparator} for comparing the two values * @return a {@code BinaryOperator} which returns the greater of its operands, * according to the supplied {@code Comparator} * @throws NullPointerException if the argument is null */ public static <T> BinaryOperator<T> maxBy(final Comparator<? super T> comparator) { Objects.requireNonNull(comparator); return new BinaryOperator<T>() { @Override public T apply(T a, T b) { return comparator.compare(a, b) >= 0 ? a : b; } }; } } }