2010-10-28 7 views
8

Siguiendo obviamente funciona, pero no me gusta para envolver artículos en Tupla,argumentos de la función de guayaba

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

Quiero escribir algo como:

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

ayuda sería más útil, Ty.

Editar: Problema resuelto, comenzaron a usar:

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

Puede hacer esto devolviendo otra 'Función' de su' Function.apply', y luego aplicar eso al segundo argumento. 'Function.apply (a) .apply (b)'. La función "interna" usaría 'a' directamente, y recibiría' b' como parámetro. Esto podría ampliarse para parámetros 'n'. Eso imitaría el tratamiento de Haskell de las funciones, pero no estoy seguro de qué ganarías en Javaland. – jpaugh

Respuesta

14

creo que sería mejor usar una interfaz de su cuenta, algo como esto:

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

guayaba de Function es una función de argumento único y no es realmente apropiado para cualquier argumento múltiple.

Otra cosa que he experimentado es un ReduceFunction<F, T> que resulta útil para tal cosa. Es para su uso con la operación reduce o fold y se ve algo como:

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

Esto le permite hacer cosas como

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

donde MathOps.add() es una ReduceFunction<Double, Double> que hace lo obvio.

+0

@CollinD: ¿Qué es reducir y doblar? No lo entiendo – Emil

+4

@Emil: Son construcciones de programación funcional, también conocidas como funciones de orden superior. Un 'reducir' generalmente reducirá una lista en un solo valor al combinar elementos a través de una función suministrada. Un 'fold' es similar a una operación de reducción, excepto que se puede sembrar con un valor inicial. La función suministrada al 'fold' combinará los elementos de la lista y el valor inicial. – gpampara

+0

@gpampara: ¿Se realiza tal programación funcional usando una API? – Emil

3

Parece que buscas un equivalente a C# 's Func: Especializado en su caso con las args y el valor de retorno del mismo tipo.

Hay otras dos preguntas con respuestas buenas acerca de este ..

Como algunas otras respuestas insinúan, puede ser atrapado en el medio entre dos paradigmas aquí (OO y funcional), algo con lo que se puede decir que el diseño del lenguaje se está poniendo al día más rápido de lo que lo es la buena práctica. Si desea continuar por ese agua turbia, puede intentar functionaljava.

Ver Mixing object-oriented and functional programming para una discusión más interesante.

Cuestiones relacionadas