it-swarm.com.ru

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

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

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

16
msung

Функциональный интерфейс - это просто интерфейс только с одним нестандартным, нестатическим методом. Все интерфейсы, которые удовлетворяют этому определению, могут быть реализованы через лямбду в 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 и все готово.

16
assylias

Вот подписи основных функциональных интерфейсов 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);
}
6
mkdev

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

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

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

1
Mark Perry

В дополнение к ответу @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, только с аннотациями и лямбдами вместо анонимных классов.

0
Vlasec