programacion funciones funcional ejemplos java scala functional-programming java-7

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