FuncとActionのJavaに相当するものは何ですか?JavaのFuncとActionに相当するもの
私は、代わりに自分でこれを書くの意味:
public interface Func<TInput, TResult>
{
TResult call(TInput target) throws Exception;
}
public interface Action<T>
{
void call(T target) throws Exception;
}
FuncとActionのJavaに相当するものは何ですか?JavaのFuncとActionに相当するもの
私は、代わりに自分でこれを書くの意味:
public interface Func<TInput, TResult>
{
TResult call(TInput target) throws Exception;
}
public interface Action<T>
{
void call(T target) throws Exception;
}
は本当にそれらのための同等物はありません。 Javaで匿名の内部クラスを作成することはできますが、FuncやActionなどの一般的なものではなく、特定のインタフェースが使用される傾向があります。
Javaには代理人の概念がありません。回避策のアプローチについては、A Java Programmer Looks at C# Delegatesを参照してください。
C#はJavaへの同様の機能 のセットがありますが、それはいくつかの 新たな、興味深い機能を追加しました。 委任は、ファーストクラスのオブジェクトとして メソッドを処理する機能です。 C# デリゲートは、Java開発者 が単一の メソッドを持つインターフェイスを使用する場合に使用されます。この記事では、C#で デリゲートを使用する方法について説明し、同様の 機能を実行できるJavaデリゲートの オブジェクトに対してコード を提示します。ソースコード をこちらからダウンロードしてください。
CallableインターフェイスはFuncと似ています。
Runnableインターフェイスはアクションに似ています。
一般に、Javaでは、C#代理人の代わりに匿名の内部クラスが使用されます。 は、たとえば、これはあなたがGUIのボタンプレスに反応するコードを追加する方法です:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
...//code that reacts to the action...
}
});
FuncとCallableを区別するものは、最大16個の引数(Func
(匿名クラスの問題で対代理人以外)オーバーロードされたFuncデリゲートの優雅さは、彼らが(0から16個の引数をサポートしていることですFunc<TResult>
,Func<T, TResult>
,Func<T1, T2, TResult>
など)
残念ながら、タイプ消去のためにJavaではこれは不可能です。ジェネリック型パラメータだけでは、クラスは異なることはできません。 Javaは、BiIntConsumer
をプリミティブ型の引数を許可していないので、
のJava 8は今、Action<T, T2>
ためBiConsumer
のような名前の動物園にもたらします。しかし、 "動物園"はそれほど大きくはありません。私はそれを拡張するライブラリを知らないのです。 (int, int) => void
のような関数型リテラルの素晴らしい提案がありましたが、採用されませんでした。
興味深いことに、CLRレベルでは、汎用パラメータの数だけ異なるクラスには異なる名前があります。 '' Func'1''などです。それらを同じ名前にマップするのはC#です。 – CodesInChaos
@CodesInChaosああ、とても面白いです。あまりにも悪いJavaはこのやり方もしませんでした。 Btw、Java 8は 'Action
Java 8では、同等のものはそれぞれjava.util.function.Function<T, R>
とjava.util.function.Consumer<T>
のインタフェースです。同様に、java.util.function.Predicate<T>
はSystem.Predicate<T>
に相当します。別のところで述べたように、これらは代理人ではなくインターフェースです。
脇関連:私は現在、LINQのような拡張メソッドのものを行うには、以下のユーティリティクラスに大きく傾いている:
abstract class IterableUtil {
public static <T> Iterable<T> where(Iterable<T> items, Predicate<T> predicate) {
ArrayList<T> result = new ArrayList<T>();
for (T item : items) {
if (predicate.test(item)) {
result.add(item);
}
}
return result;
}
public static <T, R> Iterable<R> select(Iterable<T> items, Function<T, R> func) {
ArrayList<R> result = new ArrayList<R>();
for (T item : items) {
result.add(func.apply(item));
}
return result;
}
}
をSystem.Linq.Enumerable.Where<TSource>
とSystem.Linq.Enumerable.Select<TSource, TResult>
と違って、私はここに提示LINQのような方法が怠け者ではなく、結果のコレクションを呼び出し元に返す前に、ソースのコレクションを完全に走査します。それでも、私はそれらを純粋に構文上の目的に役立ち、必要に応じて怠惰にすることができます。
class Widget {
public String name() { /* ... */ }
}
1つの所与の次の操作を行うことができます
私は次のように好むList<Widget> widgets = /* ... */;
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix"));
:
List<Widget> widgets = /* ... */;
List<Widget> filteredWidgets = new ArrayList<Widget>();
for (Widget w : widgets) {
if (w.name().startsWith("some-prefix")) {
filteredWidgets.add(w);
}
}
この質問は "Java同等のアクション"の現在の#1検索結果であり、JavaのものはJavaが以前に持っていたものよりも優れており、ほぼネットのものに近い2015なので、この回答を投票する必要がありますこの点。 –
あなたが意味すると思います Iterable
'Function
Func<T>
利用の場合:java.util.function.Supplier http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html
'Supplier'は' Func
はい、あなたは間違いありません。この投稿には、Java用の 'Func
答えはとにかく私にとっては役に立ちました。 javaには 'Action <>'のようなものもあります:0入力、0出力。せいぜい '.andThen(...)'機能だけで。 –
http://stackoverflow.com/questions/7296606/what-is-the-closesも参照してください。 – nawfal