2011-05-11 26 views
10

¿cómo se puede emular la programación funcional en Java, específicamente, hacer cosas como asignar una función a una colección de elementos?
programación funcional en Java

 
map(func, new String[]{"a","b","c"}); 

¿cuál es la verbosa & forma menos incómoda para hacerlo?

Respuesta

9

Por desgracia todos los intentos de la programación funcional tendrá una parte de detallado y/o incómoda a ella en Java.

El forma más directa es proporcionar una interfaz Function (como this one form Guava) y proporcionar todo tipo de métodos que toman y lo llaman (como Collections#transfrom() el que hace lo que yo creo que su método map() debe hacer).

Lo malo es que es necesario implementar Function ya menudo lo hace con una clase interna anónima, que tiene una sintaxis terriblemente detallado:

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

Cabe señalar que la función de Lambda prevista de Java 8 lo hará considerablemente más fácil (¡y posiblemente aún más rápido!). El código equivalente en (la forma actual de) lambdas se vería así:

Collection<OutputType> result = Collections.transform(input, SomeClass::frobnicate); 

o más detallado, pero más flexible:

Collection<OutputType> result = Collections.transform(input, in -> frobnicate(in)); 
2

Simplemente envuelva la función que desea aplicar en la lista con una clase o una interfaz.

public interface Func { 
    Object f(Object input); 
} 

public void map (Func func, Object[] arr) { 
    for(int i=0;i<arr.legnth;i++) { 
    arr[i] = func.f(arr[i]); 
    } 
} 

map(
    new Func() { public Object f(Object input) { return input; } };, 
    new String[]{"a","b"}); 
1

Como usted señala, Java no está diseñado para la programación funcional y al mismo tiempo se puede emular a ella, hay que querer realmente hacer esto incluso si es más detallado y más torpe que el uso de programación estándar en Java.

Tome el ejemplo de @Jachim.

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

Utiliza 12 símbolos, sin contar los corchetes cercanos. Lo mismo en Java simple se vería.

List<OutputType> list = new ArrayList(); 
for(InputType in: input) 
    list.add(frobnicate(in)); 

Esto utiliza 7 símbolos.

Puede hacer programación funcional en Java, pero debe esperar que sea más detallado y torpe que usar el estilo de programación natural de Java.

1

Puede descargar OpenJDK 8, que está programado para su lanzamiento el año próximo y usar las nuevas Lambda Expressions para la programación funcional. Consulte http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html para ver ejemplos de cómo se usarán estos cierres en las API de recopilación y cómo se comparan con las soluciones anteriores a Java 8, como Guava y LambdaJ.

Cuestiones relacionadas