2009-07-26 14 views
60

FuncActionの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; 
} 
+0

http://stackoverflow.com/questions/7296606/what-is-the-closesも参照してください。 – nawfal

答えて

3

は本当にそれらのための同等物はありません。 Javaで匿名の内部クラスを作成することはできますが、FuncやActionなどの一般的なものではなく、特定のインタフェースが使用される傾向があります。

3

Javaには代理人の概念がありません。回避策のアプローチについては、A Java Programmer Looks at C# Delegatesを参照してください。

C#はJavaへの同様の機能 のセットがありますが、それはいくつかの 新たな、興味深い機能を追加しました。 委任は、ファーストクラスのオブジェクトとして メソッドを処理する機能です。 C# デリゲートは、Java開発者 が単一の メソッドを持つインターフェイスを使用する場合に使用されます。この記事では、C#で デリゲートを使用する方法について説明し、同様の 機能を実行できるJavaデリゲートの オブジェクトに対してコード を提示します。ソースコード をこちらからダウンロードしてください。

27

CallableインターフェイスはFuncと似ています。

Runnableインターフェイスはアクションに似ています。

一般に、Javaでは、C#代理人の代わりに匿名の内部クラスが使用されます。 は、たとえば、これはあなたがGUIのボタンプレスに反応するコードを追加する方法です:

button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      ...//code that reacts to the action... 
     } 
}); 
+12

FuncとCallableを区別するものは、最大16個の引数(Func 、Func 、Func など)。 OTOH、Callableは引数をとりません。さらに、ジェネリックの型消去のためにC#のオーバーロードを実装することは不可能です。 –

5

(匿名クラスの問題で対代理人以外)オーバーロードされたFuncデリゲートの優雅さは、彼らが(0から16個の引数をサポートしていることですFunc<TResult>,Func<T, TResult>,Func<T1, T2, TResult>など)

残念ながら、タイプ消去のためにJavaではこれは不可能です。ジェネリック型パラメータだけでは、クラスは異なることはできません。 Javaは、BiIntConsumerをプリミティブ型の引数を許可していないので、

のJava 8は今、Action<T, T2>ためBiConsumerのような名前の動物園にもたらします。しかし、 "動物園"はそれほど大きくはありません。私はそれを拡張するライブラリを知らないのです。 (int, int) => voidのような関数型リテラルの素晴らしい提案がありましたが、採用されませんでした。

+2

興味深いことに、CLRレベルでは、汎用パラメータの数だけ異なるクラスには異なる名前があります。 '' Func'1''などです。それらを同じ名前にマップするのはC#です。 – CodesInChaos

+0

@CodesInChaosああ、とても面白いです。あまりにも悪いJavaはこのやり方もしませんでした。 Btw、Java 8は 'Action 'の 'BiConsumer'のような名前の動物園を持ち、Javaはプリミティブ型のパラメータである' BiIntConsumer'を許可していないので、 '(int、int)=> void'のような関数型リテラルの提案がありましたが、採用されていませんでした。 –

66

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); 
    } 
} 
+1

この質問は "Java同等のアクション"の現在の#1検索結果であり、JavaのものはJavaが以前に持っていたものよりも優れており、ほぼネットのものに近い2015なので、この回答を投票する必要がありますこの点。 –

+1

あなたが意味すると思います Iterable filteredWidgets = IterableUtil.where(ウィジェット、w - > w.name()。startsWith( "some-prefix")); – electricalbah

+0

'Function 'と 'Consumer 'のほかに、Javaが提供する一般的な機能インタフェースの完全なセットがあります(https://docs.oracle.com/javase/8/docs/api/java)。 /util/function/package-summary.html)。 – ZenLulz

2

Func<T>利用の場合:java.util.function.Supplier http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html

+0

'Supplier'は' Func '(' Func 'とは対照的に)' Action'ではなく 'Func 'です。 'Action'は引数を受け入れず、結果を返しません。 ( 'Action'の他のバージョンはさまざまな引数を受け入れて結果を返しません) – Servy

+0

はい、あなたは間違いありません。この投稿には、Java用の 'Func 'を探していて、誤って 'Action 'と覚えていたので、私はこの投稿に出ました。 Oops –

+0

答えはとにかく私にとっては役に立ちました。 javaには 'Action <>'のようなものもあります:0入力、0出力。せいぜい '.andThen(...)'機能だけで。 –

関連する問題