Мне нужен интерфейс вроде:
interface Function<X,Y> {
Y eval(X obj);
}
Есть ли что-то подобное в Java уже или мне нужно определить мои собственные?
Мне нужен интерфейс вроде:
interface Function<X,Y> {
Y eval(X obj);
}
Есть ли что-то подобное в Java уже или мне нужно определить мои собственные?
Существует такой встроенный интерфейс, хотя он совместим только с Java 8 и далее. Вы можете найти здесь.
Из Javadocs:
public interface Function<T,R>
Представляет функцию, которая принимает один аргумент и создает результат.
Это функциональный интерфейс, функциональный метод которого
apply(Object)
.Параметры типа:
T
- тип ввода функцииR
- тип результата функции
Отъезд 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);
}
К сожалению, такого нет в основных библиотеках Java. Как следствие, многие библиотеки определяют свой собственный функционально-подобный интерфейс. Если вы уже используете такую библиотеку, вы можете повторно использовать используемую им функцию.
Вы можете использовать библиотеку, такую как Apache Commons Functor, которая имеет полезные функции, такие как:
UnaryFunction
T evaluate(A obj);
BinaryFunction
T evaluate(L left, R right);
На самом деле, учитывая, что ваша цель - ваша, а не Sun/Oracle one, вы должны определять свой собственный интерфейс (так как он определяет контракт, который вы хотите реализовать для вашего интерфейса для fullfil).
Однако, если какая-то инфраструктура уже существует с таким интерфейсом, и ее цель та же, что и ваша, вы можете использовать ее определение, но с большой осторожностью.