IOBinaryOperator.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.apache.commons.io.function;

  18. import java.io.IOException;
  19. import java.io.UncheckedIOException;
  20. import java.util.Objects;
  21. import java.util.function.BinaryOperator;

  22. /**
  23.  * Like {@link BinaryOperator} but throws {@link IOException}.
  24.  *
  25.  * @param <T> the type of the operands and result of the operator.
  26.  * @see IOBiFunction
  27.  * @see BinaryOperator
  28.  * @since 2.12.0
  29.  */
  30. @FunctionalInterface
  31. public interface IOBinaryOperator<T> extends IOBiFunction<T, T, T> {

  32.     /**
  33.      * Creates a {@link IOBinaryOperator} which returns the greater of two elements according to the specified
  34.      * {@code Comparator}.
  35.      *
  36.      * @param <T> the type of the input arguments of the comparator
  37.      * @param comparator a {@code Comparator} for comparing the two values
  38.      * @return a {@code BinaryOperator} which returns the greater of its operands, according to the supplied
  39.      *         {@code Comparator}
  40.      * @throws NullPointerException if the argument is null
  41.      */
  42.     static <T> IOBinaryOperator<T> maxBy(final IOComparator<? super T> comparator) {
  43.         Objects.requireNonNull(comparator);
  44.         return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
  45.     }

  46.     /**
  47.      * Creates a {@link IOBinaryOperator} which returns the lesser of two elements according to the specified
  48.      * {@code Comparator}.
  49.      *
  50.      * @param <T> the type of the input arguments of the comparator
  51.      * @param comparator a {@code Comparator} for comparing the two values
  52.      * @return a {@code BinaryOperator} which returns the lesser of its operands, according to the supplied
  53.      *         {@code Comparator}
  54.      * @throws NullPointerException if the argument is null
  55.      */
  56.     static <T> IOBinaryOperator<T> minBy(final IOComparator<? super T> comparator) {
  57.         Objects.requireNonNull(comparator);
  58.         return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
  59.     }

  60.     /**
  61.      * Creates a {@link BinaryOperator} for this instance that throws {@link UncheckedIOException} instead of
  62.      * {@link IOException}.
  63.      *
  64.      * @return an unchecked BiFunction.
  65.      */
  66.     default BinaryOperator<T> asBinaryOperator() {
  67.         return (t, u) -> Uncheck.apply(this, t, u);
  68.     }
  69. }