Функциональные интерфейсы java 8 в java 7

- это функциональные интерфейсы java 8, доступные где-нибудь (т.е. jar), поэтому я могу использовать их в проекте Java 7? таким образом, я мог бы позже упростить перенос кода на идиоматическую java 8. Если нет, это технически возможно или они используют новые функции, такие как методы по умолчанию?

да, я имел в виду интерфейсы в java.util.function. поскольку добавление пакетов с префиксом java кажется запрещенным, импортируя их из другого места, это не вариант.

Ответы

Ответ 1

Функциональный интерфейс - это просто интерфейс с одним нестандартным, не статическим методом. Все интерфейсы, которые удовлетворяют этому определению, могут быть реализованы через лямбда в Java 8.

Например, Runnable - это функциональный интерфейс, а в Java 8 вы можете написать: Runnable r = () -> doSomething();.

Многие функциональные интерфейсы, созданные Java 8, находятся в пакете java.util.function. Наиболее распространенными являются:

  • Consumer<T>, который имеет void accept(T t)
  • Supplier<T>, который имеет T get()
  • Function<T, R>, который имеет R apply(T t)
  • Predicate<T>, который как boolean test(T t)

На этом этапе вы можете использовать интерфейсы с одним интерфейсом, где это имеет смысл, если возможно, с аналогичными сигнатурами. Когда вы перейдете на Java 8, вы сможете легко реорганизовать через вашу среду IDE:

someMethod(new MyConsumer<T>() { public void accept(T t) { use(t); } });

в

someMethod(t -> use(t));

Затем измените подпись someMethod(MyConsumer<T> mc) на someMethod(Consumer<T> c), избавьтесь от интерфейса MyConsumer, и все будет готово.

Ответ 2

Вот подписи основных функциональных интерфейсов java 8 как дополнение к ответу assylias

public interface Consumer<T> {
    void accept(T t);
}

public interface Supplier<T> {
    T get();
}

public interface Function<T, R> {
    R apply(T t);
}

public interface Predicate<T> {
    boolean test(T t);
}

Ответ 3

Функциональные интерфейсы Java 8 ограничены. Используйте функции FunctionalJava P1, F, F2, F3,..., F8, TryCatch0, TryCatch1,..., TryCatch8, чтобы сделать то же самое сейчас с большей функциональностью.

https://functionaljava.ci.cloudbees.com/job/master/javadoc/

Вы можете использовать проект Retro Lambda для компиляции с Java 8 и lambdas, но нацелены на виртуальную машину Java 7. Это позволяет избежать всего анонимного внутреннего класса. См. Проект FunctionalJava для примера (http://www.functionaljava.org/).

Ответ 4

В дополнение к ответу @assylias, который, как я думаю, решает проблему в большинстве случаев, есть еще один вариант, а именно, сделать свой собственный @FunctionalInterface и сохранить его таким образом.

Это зависит от того, где вы используете функции. Все вышеупомянутые интерфейсы могут использоваться служебными классами JDK. Predicate позволяет фильтровать, Supplier позволяет создавать объекты, Function позволяет отображать... На самом деле, Predicate и Supplier являются довольно скрытыми, но Function и Consumer могут быть часто неясными, особенно BiFunction. Они могут также связывать ваши руки в некоторых случаях.

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

//@FunctionalInterface
public interface MyCustomInterface {
    <T> MyCustomOutput myCustomAction(MyCustomInput<T> str) throws MyCustomException;
}

Итак, хотя интерфейсы, предоставляемые с помощью JDK, полезны, иногда вы можете предпочесть сохранить свое собственное решение даже в Java 8, просто с аннотациями и lambdas вместо анонимных классов.