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

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

<p>функциональный интерфейс - это просто интерфейс только с одним нестандартным, нестатическим методом. все интерфейсы, которые удовлетворяют этому определению, могут быть реализованы через лямбду в java 8.</p><p>например, <code>runnable</code> - это функциональный интерфейс, а в java 8 вы можете написать: <code>runnable r = () -> dosomething();</code>.</p><p>многие из функциональных интерфейсов, представленных java 8, находятся в <a href="http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">пакете <code>java.util.function</code></a> . наиболее распространенными являются:</p><ul> <li><code>consumer<t></code>, который имеет <code>void accept(t t)</code></li> <li><code>supplier<t></code>, который имеет <code>t get()</code></li> <li><code>function<t, r></code>, который имеет <code>r apply(t t)</code></li> <li><code>predicate<t></code> который как <code>boolean test(t t)</code></li> </ul><hr><p>на этом этапе вы могли бы использовать интерфейсы с одним методом везде, где это имеет смысл, если это возможно, с аналогичными сигнатурами. при переходе на java 8 вы сможете легко выполнить рефакторинг через ваш ide из:</p><pre><code>somemethod(new myconsumer<t>() { public void accept(t t) { use(t); } }); </code></pre><p>в</p><pre><code>somemethod(t -> use(t)); </code></pre><p>затем измените подпись <code>somemethod(myconsumer<t> mc)</code> на <code>somemethod(consumer<t> c)</code>, избавьтесь от интерфейса <code>myconsumer</code> и все готово.</p>

<p>вот подписи основных функциональных интерфейсов java 8 как дополнение к assylias.</p><pre><code>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); } </code></pre>

<p>функциональные интерфейсы java 8 ограничены. используйте типы functionaljava p1, f, f2, f3, ..., f8, trycatch0, trycatch1, ..., trycatch8, чтобы сделать то же самое теперь с большей функциональностью.</p><p> <a href="https://functionaljava.ci.cloudbees.com/job/master/javadoc/">https://functionaljava.ci.cloudbees.com/job/master/javadoc/</a> </p><p>вы можете использовать проект retro lambda для компиляции с java 8 и лямбдами, но ориентируйтесь на виртуальную машину java 7. это позволяет избежать всей бессмысленной глупости внутреннего класса. см. пример проекта functionaljava ( <a href="http://www.functionaljava.org/">http://www.functionaljava.org/</a> ).</p>

<p>в дополнение к ответу @assylias, который, я думаю, решает проблему в большинстве случаев, есть еще один вариант, а именно, создать свой собственный <code>@functionalinterface</code> и сохранить его таким образом.</p><p>это зависит от того, где вы используете функции. все вышеупомянутые интерфейсы могут использоваться служебными классами jdk. <code>predicate</code> позволяет фильтровать, <code>supplier</code> разрешает создание объекта, <code>function</code> позволяет отображать ... на самом деле, <code>predicate</code> и <code>supplier</code> довольно просты, но <code>function</code> и <code>consumer</code> часто могут быть неясными, особенно <code>bifunction</code>. они также могут связать ваши руки в некоторых случаях использования.</p><p>вы можете написать свой собственный интерфейс, который имеет любое количество входных данных, выбрасывает проверенные исключения, имеет дженерики только там, где они вам нужны, и его имя говорит, для чего его следует использовать.</p><pre><code>//@functionalinterface public interface mycustominterface { <t> mycustomoutput mycustomaction(mycustominput<t> str) throws mycustomexception; } </code></pre><p>итак, хотя интерфейсы, предоставляемые с jdk, полезны, иногда вы можете предпочесть оставить свое собственное решение даже в java 8, только с аннотациями и лямбдами вместо анонимных классов.</p>