web-dev-qa-db-ja.com

Java 8 in Java 7

Java 8の機能的なインターフェイスはどこか(つまりjar)で利用できるので、Java 7プロジェクトで使用できますか?そうすれば、後で簡単にコードを慣用的なJava 8.に移植します。そうでない場合、それは技術的に可能ですか、それともデフォルトのメソッドのような新しい機能を利用しますか?

はい、私はJava.util.functionのインターフェースを意味しました。 Java接頭辞付きのパッケージを追加することは許可されていないようなので、他の場所からのパッケージのインポートはオプションではありません。

19
msung

機能インターフェースは、デフォルト以外の非静的メソッドが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インターフェースを削除すれば完了です。

17
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 VMをターゲットにします。これにより、匿名の内部クラス全体がナンセンスになります。例のFunctionalJavaプロジェクト( http://www.functionaljava.org/ )。

1
Mark Perry

ほとんどの場合問題を解決すると私が思う@assyliasによる回答に加えて、もう1つのオプションがあります。つまり、独自の@FunctionalInterfaceそのままにします。

関数をどこで使用するかによって異なります。前述のすべてのインターフェースは、JDKユーティリティクラスで使用できます。 Predicateはフィルタリングを許可し、Supplierはオブジェクトの作成を許可し、Functionはマッピングを許可します...実際、PredicateSupplierはかなり単純です。ただし、FunctionConsumerは、特にBiFunctionは不明確になることがよくあります。また、一部の使用例では、手を結ぶこともできます。

任意の量の入力を持ち、チェックされた例外をスローし、必要な場所にのみジェネリックスを持ち、その名前が何のために使用されるべきかを表す独自のインターフェースを作成できます。

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

そのため、JDKで提供されるインターフェースは便利ですが、Java 8でもアノテーションだけで、匿名クラスではなくラムダを使用して、独自のソリューションを維持したい場合があります。

0
Vlasec