funciones - Scala a Java(programación funcional)
programacion funcional (2)
Me han pedido que ''traduzca'' algún código de Scala a Java para un curso. Sin embargo, los requisitos de la asignación son que Java 8 y las bibliotecas externas, como Functional Java y Totally Lazy , no están permitidas . La línea en Scala es:
charges.groupBy(_.cc).values.map(_.reduce(_ combine _)).toList
Pude escribir groupBy y values pero .map y _.reduce aún me eluden. He revisado el código fuente de esas dos bibliotecas, así como la fuente de Scala, para intentar encontrar algo que me ayude a reunirlos, pero no he podido avanzar.
GroupBy se implementa de la siguiente manera:
public Map<CreditCard, List<Charge>> groupBy(List<Charge> list)
{
Map<CreditCard, List<Charge>> map = new TreeMap<CreditCard, List<Charge>>();
for(Charge c: list)
{
List<Charge> group = map.get(c.cc);
if(group == null)
{
group = new ArrayList();
map.put(c.cc, group);
}
group.add(c);
}
return map;
}
Tendrás que iterar sobre los valores. Por lo general, sugiero usar un nuevo estilo for loop. Algo como:
for (ValuesType value : values) {
// do your map and reduce here
}
El problema con eso es que necesitas tener acceso a más de un valor a la vez. (Consulte la discusión sobre .reduce() , a continuación.) De modo que quizás el estilo anterior sea mejor:
for (int i = 0; i < values.length - 1; i++) {
// do something with values.get(i) or values[i] as needed
}
Punto para ponderar: ¿ values.length - 1 qué values.length - 1 ?
.map() simplemente transforma una cosa en otra. ¿Cuál es la transformación en este caso? Es el .reduce() ! Entonces eso debería ser lo suficientemente fácil.
El _ en _.reduce() es el equivalente de value en la instrucción for anterior. Es el único valor con el que estás lidiando en esta iteración.
.reduce() toma dos valores y les hace algo para convertirlos en un solo valor. Para que funcione, tendrás que lidiar con values.get(i) y values.get(i+1) alguna manera. Y _ combine _ , bueno, dígame.
puedes usar Google Guava para esto. no requiere java8. usted estaría especialmente interesado en la clase que llama FluentIterable . aquí hay algunos métodos que podrían ayudarlo:
- índice (Function keyFunction) - la función utilizada para producir la clave para cada valor
- transformar (función Función) - aplica {@code function} a cada elemento de este fluido iterable
y hay mucho más