2009-07-26 15 views
60

Quali sono gli equivalenti di Java di Func e Action?Equivalenti di Java di Func e Action

Voglio dire, invece di scrivere per conto mio:

public interface Func<TInput, TResult> 
{ 
    TResult call(TInput target) throws Exception; 
} 
public interface Action<T> 
{ 
    void call(T target) throws Exception; 
} 
+0

Vedi anche http://stackoverflow.com/questions/7296606/che cosa-è-la-close t-cosa-java-ha-to-the-net-func-e-azione-delegati – nawfal

risposta

3

Non ci sono davvero equivalenti per quelli. È possibile creare classi interne anonime in Java, ma tendono ad essere interfacce specifiche piuttosto che quelle generiche come Func e Action.

3

Java non ha il concetto di delegati. Per un approccio soluzione alternativa, vedere A Java Programmer Looks at C# Delegates:

Mentre C# ha una serie di funzionalità simile a Java, ha aggiunto diverse nuove ed interessanti funzionalità. Delega è la capacità di trattare un metodo come oggetto di prima classe. Un delegato C# viene utilizzato quando gli sviluppatori Java utilizzano un'interfaccia con un singolo metodo . In questo articolo viene discusso l'uso dei delegati in C# e il codice viene presentato per un oggetto Delegato Java che può eseguire una funzione simile . Scarica il codice sorgente qui.

27

Callable l'interfaccia è simile a Func.

Runnable L'interfaccia è simile all'azione.

In generale, Java utilizza classi interne anonime in sostituzione di delegati C#. Per esempio, questo è il modo si aggiunge il codice di reagire a premere il pulsante in GUI:

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

Ciò che distingue Func da Callable, è che ci sono sovraccarichi generici per un massimo di 16 argomenti (Func , func , Func , ecc.). OTOH, Callable non accetta argomenti. Inoltre, è impossibile implementare i sovraccarichi di C# a causa della cancellazione del tipo nei generici. –

5

L'eleganza dei delegati Func sovraccarico (oltre il delegato vs problema classe anonima) è che sostengono da 0 a 16 argomenti (Func<TResult>, Func<T, TResult>, Func<T1, T2, TResult>, ecc.)

Sfortunatamente, questo è impossibile in Java a causa della cancellazione dei tipi. Le classi non possono differire dai soli parametri di tipo generico.

Java 8 ora introduce uno zoo di nomi come BiConsumer per Action<T, T2> e, poiché Java non consente argomenti di tipo primitivo, BiIntConsumer. Lo "zoo", però, non è molto grande, e non sono a conoscenza di una libreria che la espande. C'era una meravigliosa proposta per i letterali tipo funzione come (int, int) => void ma non è stata adottata.

+2

È interessante notare che nelle classi di livello CLR che differiscono solo per il numero di parametri generici hanno nomi diversi. '' Func'1'' ecc. E 'solo C# che mappa quelli con lo stesso nome. – CodesInChaos

+0

@CodesInChaos Ahh, molto interessante. Peccato che Java non l'abbia fatto in questo modo. Btw, Java 8 ora introduce uno zoo di nomi come 'BiConsumer' per' Azione 'e, poiché Java non consente parametri di tipo primitivo,' BiIntConsumer'. C'era una proposta per i letterali del tipo di funzione come '(int, int) => void' ma non è stata adottata. –

66

In Java 8, gli equivalenti sono rispettivamente le interfacce java.util.function.Function<T, R> e java.util.function.Consumer<T>. Allo stesso modo, java.util.function.Predicate<T> equivale a System.Predicate<T>. Come accennato altrove, queste sono interfacce invece di delegati.

Related parte: Attualmente sto appoggiato pesantemente sul seguente classe di utilità per fare LINQ come metodo di estensione roba:

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; 
    } 
} 

differenza System.Linq.Enumerable.Where<TSource> e System.Linq.Enumerable.Select<TSource, TResult> metodi LINQ-like che presento qui non sono pigri e attraversare completamente le raccolte di origine prima di restituire le raccolte di risultati al chiamante. Tuttavia, li trovo utili a fini puramente sintattici e potrebbero essere resi pigri se necessario. Dato

class Widget { 
    public String name() { /* ... */ } 
} 

si può fare quanto segue:

List<Widget> widgets = /* ... */; 
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix")); 

che io preferisco il seguente:

List<Widget> widgets = /* ... */; 
List<Widget> filteredWidgets = new ArrayList<Widget>(); 
for (Widget w : widgets) { 
    if (w.name().startsWith("some-prefix")) { 
    filteredWidgets.add(w); 
    } 
} 
+1

abbiamo davvero bisogno di votare questa risposta come questa domanda è l'attuale # 1 risultati di ricerca "Java equivalente di azione" ed è ora 2015 così la roba Java 8 è il modo migliore di quello che Java era roba prima e quasi imita di .net a questo punto. –

+1

Credo che si intende Iterable filteredWidgets = IterableUtil.where (widget, w -> w.name() startsWith ("some-prefisso").); – electricalbah

+0

Inoltre di 'Funzione ' e '' consumatori , è possibile trovare il set completo di interfacce funzionali comuni che Java fornisce [qui] (https://docs.oracle.com/javase/8/docs/api/java /util/function/package-summary.html). – ZenLulz

2
+0

'Supplier' sarebbe equivalente a' 'Func (al contrario di' Func ') non' Action'. Un 'Azione' non accetta argomenti e non restituisce alcun risultato. (Altre versioni di 'Action' accettano vari numeri di argomenti e non restituiscono alcun risultato.) – Servy

+0

Sì, hai ragione, mio ​​errore. Mi sono imbattuto in questo post perché cercavo per il '' Func per Java ed erroneamente ricordato come 'Azione '. Oops –

+0

La risposta mi è stata utile comunque. Java ha anche qualcosa come "Action <>": 0 input, 0 output. Nel migliore dei casi con '.andThen (...)' funzionalità. –

Problemi correlati