あなたはJavaで全く同じことをするつもりはありませんが、あなたがやっていることの原則は同じでなければなりません。
functor_obj()
のように呼び出すことができるファンクタをJavaで使用するには、これは不可能です。 Javaでは演算子のオーバーロードが許可されていない*ので、その種の構文は単純にできません。
しかし、Java 8では、「ファンクショナルインターフェイス」という概念が導入されました。これは、まさに1つの[抽象的な**]機能を持つインターフェイスとして定義されています。 Functional Interfaceで作業しているときはいつでも、インスタンス化をラムダ式に置き換えることができます。
Runnable run =() -> {System.out.println("Hello World (FROM THE SECOND DIMEN—I mean THREAD)");};
Thread thread = new Thread(run);
//Also Equivalent to the two above lines:
//Thread thread = new Thread(() -> {System.out.println("Hello World (FROM THE SECOND DIMEN—I mean THREAD)");});
thread.start();
thread.join();
あなたは、この特定のファンクタを起動したい場合、あなたは単にあなたがインターフェイスを実装し、他のオブジェクトと同じ呼び出したい:どのようなJavaのラムダ式を行うことは非表示ですので
run.run();
は、実装。次のコード:
public static double test(Supplier<Double> f) {//imported from java.util.function
return f.get();
}
:あなたの例のために、あなたはおそらくこのような何かを書きたい
Runnable run = new Runnable() {
public void run() {
System.out.println("Hello World (FROM THE SECOND DIMEN—I mean THREAD)");
}
};
ので:
Runnable run =() -> {System.out.println("Hello World (FROM THE SECOND DIMEN—I mean THREAD)");};
は、Java 7同等のコードと同じことを行いこのように呼び出すことができます:
double a = test(() -> 25);
オリジナルのmain
機能で書いたコードと同等のコードです。あなたは将来の使用のためにファンクタを格納する必要がある場合と、あなたはこのようにそれを記述します
Supplier<Double> sup =() -> 25;
double a = test(sup);
/*sup can now be stored somewhere or passed to a different function.*/
は、* - 私が意味する、Javaはへ+
の使用を可能にしString
オブジェクトのための演算子オーバーロードを持っていますオブジェクトを連結することができますが、それはそれが使用される唯一の状況です。
** - Java 8では、インターフェイスに「デフォルト」メソッドが導入されました。これにより、インターフェイスでメソッドが実装されるようになりました。それは、アクセサーと削除操作を持つすべてのリストが共通の汎用アルゴリズムを使用してソートされるように、public default void sort()
のようなものをjava.util.List<T>
に追加することができるようになるまで、変わったように見えるかもしれません。Javaの8で
あり確認されています... –
それはそれはあなたが*実際に*を達成しようとしている何であるかは不明です。これはラムダの単純なケースのようです。 – chrylis
@ chrylis lambaなしでも可能ですか?機能が複雑になる可能性があります... – justik