Java: общая функция X-> Y интерфейс

Мне нужен интерфейс вроде:

interface Function<X,Y> {
    Y eval(X obj);
}

Есть ли что-то подобное в Java уже или мне нужно определить мои собственные?

Ответ 1

Существует такой встроенный интерфейс, хотя он совместим только с Java 8 и далее. Вы можете найти здесь.

Из Javadocs:

public interface Function<T,R>

Представляет функцию, которая принимает один аргумент и создает результат.

Это функциональный интерфейс, функциональный метод которого apply(Object).

Параметры типа:
    T - тип ввода функции      R - тип результата функции

Ответ 2

Отъезд Guava, Функциональный интерфейс:

public interface Function<F, T> {
  /**
   * Applies the function to an object of type {@code F}, resulting in an object of     type {@code T}.
   * Note that types {@code F} and {@code T} may or may not be the same.
   *
   * @param from the source object
   * @return the resulting object
   */
  T apply(@Nullable F from);

  /**
   * Indicates whether some other object is equal to this {@code Function}. This     method can return
   * {@code true} <i>only</i> if the specified object is also a {@code Function} and, for every
   * input object {@code o}, it returns exactly the same value. Thus, {@code
   * function1.equals(function2)} implies that either {@code function1.apply(o)} and {@code
   * function2.apply(o)} are both null, or {@code function1.apply(o).equals(function2.apply(o))}.
   *
   * <p>Note that it is always safe <i>not</i> to override {@link Object#equals}.
   */
  boolean equals(@Nullable Object obj);
 }

Ответ 3

К сожалению, такого нет в основных библиотеках Java. Как следствие, многие библиотеки определяют свой собственный функционально-подобный интерфейс. Если вы уже используете такую ​​библиотеку, вы можете повторно использовать используемую им функцию.

Ответ 4

Вы можете использовать библиотеку, такую ​​как Apache Commons Functor, которая имеет полезные функции, такие как:

UnaryFunction

T evaluate(A obj);

BinaryFunction

T evaluate(L left, R right); 

Ответ 5

На самом деле, учитывая, что ваша цель - ваша, а не Sun/Oracle one, вы должны определять свой собственный интерфейс (так как он определяет контракт, который вы хотите реализовать для вашего интерфейса для fullfil).

Однако, если какая-то инфраструктура уже существует с таким интерфейсом, и ее цель та же, что и ваша, вы можете использовать ее определение, но с большой осторожностью.