2010-10-28 20 views
8

seguito, ovviamente, funziona, ma non mi piace per avvolgere oggetti in Tuple,argomenti della funzione Guava

ImmutableMap<String, Function<Tuple2<Double>, Double>> op = new // 
    ImmutableMap.Builder<String, Function<Tuple2<Double>, Double>>() 
      .put("+", new Function<Tuple2<Double>, Double>() { 
       @Override public Double apply(Tuple2<Double> data) { 
        return data.Val_1 + data.Val_2; 
       } 
      }).build(); 
    System.out.println(op.get("+").apply(new Tuple2<Double>(3d, 4d))); 

voglio scrivere qualcosa di simile:

ImmutableMap<String, Function<Double[], Double>> op = new // 
    ImmutableMap.Builder<String, Function<Double[], Double>>() 
      .put("+", new Function<Double[], Double>() { 
       @Override 
       public Double apply(Double... data) { 
        return data[0] + data[1]; 
       } 
      }).build(); 
    System.out.println(op.get("+").apply(3d, 4d)); 

aiuto sarebbe più utile, Ty.

Edit: Problema risolto, iniziato ad usare:

public interface T2Function<T> { 
    T apply(T Val_1, T Val_2); 
} 
+0

Si potrebbe fare ciò restituendo un altro 'Funzione' dal proprio' Function.apply', e quindi applicandolo al secondo argomento. 'Function.apply (a) .Applicare (b)'. La funzione "inner" userebbe 'a' direttamente e riceveva' b' come parametro. Questo potrebbe essere esteso per i parametri 'n'. Ciò simulerebbe il trattamento delle funzioni di Haskell, ma non sono sicuro di cosa ne trarrai in Javaland. – jpaugh

risposta

14

penso che si sarebbe meglio usare un'interfaccia di tuo, qualcosa di simile:

public interface Operation { 
    double apply(double a, double b); 
} 

Guava di Function è una funzione a singolo argomento e non proprio appropriata per qualcosa di multi-argomento.

Un'altra cosa che ho sperimentato è un ReduceFunction<F, T> che sembra essere utilizzabile per una cosa del genere. E 'per l'uso con l'operazione reduce o fold e appare come:

public interface ReduceFunction<F, T> { 
    T apply(T a, F b); // I can't decide on good names for the parameters =(
} 

Questo ti permette di fare le cose come

List<Double> doubles = ... 
Double sum = reduce(doubles, MathOps.add(), 0.0); 

dove MathOps.add() è un ReduceFunction<Double, Double> che fa la cosa più ovvia.

+0

@CollinD: Cos'è ridurre e piegare? Non capisco – Emil

+4

@Emil: sono costrutti di programmazione funzionale, noti anche come funzioni di ordine superiore. Un 'reduce' ridurrà generalmente una lista in un singolo valore combinando gli elementi attraverso una funzione fornita. Un 'fold' è simile a un'operazione di riduzione, tranne che può essere seminato con un valore iniziale. La funzione fornita a 'fold' combinerà quindi gli elementi dell'elenco e il valore di seeding. – gpampara

+0

@gpampara: tale programmazione funzionale viene eseguita utilizzando un'api? – Emil

3

Sembra che tu stia cercando un equivalente al numero di telefono Func: Specializzato nel tuo caso con gli argomenti e il valore restituito dello stesso tipo.

Ci sono altre due domande con buone risposte su questo ..

Come alcune altre risposte suggeriscono, si può essere bloccato in mezzo tra due paradigmi qui (OO e funzionale), qualcosa con cui il design linguistico sta probabilmente recuperando più velocemente di quanto non facciano le buone pratiche. Se vuoi continuare con quell'acqua torbida, puoi provare con lo functionaljava.

Vedere Mixing object-oriented and functional programming per una discussione più interessante.

Problemi correlati