Сначала вам понадобится функциональная библиотека для Java, которая снабжает универсальные функторы и функциональные проекции, такие как сложение. Я спроектировал и реализовал мощную (в силу этого) простую, но такую библиотеку: http://www.codeproject.com/KB/java/FunctionalJava.aspx (другие библиотеки, упомянутые выше, оказались слишком сложными).
Тогда ваше решение будет выглядеть так:
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"
Обратите внимание, что при применении сгиба единственной частью, которая действительно должна быть продумана, является реализация Func2.call, 3 строки кода, которые определяют оператора, принимающего аккумулятор и элемент и возвращающего аккумулятор (моя реализация учитывает пустые строки и нули, если вы удалите этот регистр, то это будет до 2 строк кода).
А вот фактическая реализация Seq.foldl, Seq реализует Iterable :
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;
}