en primer lugar tendrás una biblioteca funcional para Java que suministra funtores genéricos y proyecciones funcionales como pliegue. He diseñado e implementado una potente (por virtud) pero simple biblioteca como esta aquí: http://www.codeproject.com/KB/java/FunctionalJava.aspx (encontré las otras bibliotecas mencionadas demasiado complicadas).
A continuación, la solución se vería así:
Seq.of("","a",null,"b","",null,"c","").foldl(
new StringBuilder(), //seed accumulator
new Func2<StringBuilder,String,StringBuilder>(){
public StringBuilder call(StringBuilder acc,String elmt) {
if(acc.length() == 0) return acc.append(elmt); //do not prepend "," to beginning
else if(elmt == null || elmt.equals("")) return acc; //skip empty elements
else return acc.append(",").append(elmt);
}
}
).toString(); //"a,b,c"
Tenga en cuenta que mediante la aplicación de veces, la única parte que realmente necesita ser pensado es la implementación de Func2.call, 3 líneas de código que definen un operador aceptando el acumulador y un elemento y devolviendo el acumulador (mis cuentas de implementación para cadenas vacías y nulos, si elimina ese caso, se reduce a 2 líneas de código).
Y aquí es la aplicación real de Seq.foldl, Sec implementa Iterable <E>:
public <R> R foldl(R seed, final Func2<? super R,? super E,? extends R> binop)
{
if(binop == null)
throw new NullPointerException("binop is null");
if(this == EMPTY)
return seed;
for(E item : this)
seed = binop.call(seed, item);
return seed;
}
¿Por qué no se escribe un método de ayuda y a llamar a eso? Puedes escribir tus propias funciones. –
Claro, podría escribir uno usando el código proporcionado. Pero solo cuando estoy seguro de que no existe tal función. –
Programación funcional en Java? Pisa con suavidad y usa botas gruesas. – Juliet