Java: интерфейс общей функции X-> Y - PullRequest
10 голосов
/ 11 октября 2010

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

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

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

Ответы [ 5 ]

13 голосов
/ 11 октября 2010

Проверьте 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);
 }
6 голосов
/ 11 октября 2010

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

2 голосов
/ 23 июня 2016

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

Из Javadocs:

public interface Function<T,R>

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

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

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

2 голосов
/ 11 октября 2010

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

UnaryFunction

T evaluate(A obj);

BinaryFunction

T evaluate(L left, R right); 
0 голосов
/ 11 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...