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