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
インターフェースを削除すれば完了です。
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);
}
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 VMをターゲットにします。これにより、匿名の内部クラス全体がナンセンスになります。例のFunctionalJavaプロジェクト( http://www.functionaljava.org/ )。
ほとんどの場合問題を解決すると私が思う@assyliasによる回答に加えて、もう1つのオプションがあります。つまり、独自の@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でもアノテーションだけで、匿名クラスではなくラムダを使用して、独自のソリューションを維持したい場合があります。