En nuestro proyecto estamos migrando a java 8 y estamos probando las nuevas características del mismo.
En mi proyecto, estoy usando predicados y funciones de Guava para filtrar y transformar algunas colecciones usando Collections2.transform
y Collections2.filter
.
En esta migración, necesito cambiar, por ejemplo, el código de guayaba a los cambios de java 8. Entonces, los cambios que estoy haciendo son del tipo:
List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13);
Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){
@Override
public Integer apply(Integer n)
{
return n * 2;
}
};
Collection result = Collections2.transform(naturals, duplicate);
A...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Usando guayaba me sentí muy cómodo depurando el código ya que podía depurar cada proceso de transformación, pero mi preocupación es cómo depurar, por ejemplo .map(n -> n*2)
.
Usando el depurador puedo ver un código como:
@Hidden
@DontInline
/** Interpretively invoke this form on the given arguments. */
Object interpretWithArguments(Object... argumentValues) throws Throwable {
if (TRACE_INTERPRETER)
return interpretWithArgumentsTracing(argumentValues);
checkInvocationCounter();
assert(arityCheck(argumentValues));
Object[] values = Arrays.copyOf(argumentValues, names.length);
for (int i = argumentValues.length; i < values.length; i++) {
values[i] = interpretName(names[i], values);
}
return (result < 0) ? null : values[result];
}
Pero no es tan sencillo como Guava depurar el código, en realidad no pude encontrar la n * 2
transformación.
¿Hay alguna forma de ver esta transformación o una forma de depurar fácilmente este código?
EDITAR: agregué respuestas de diferentes comentarios y publiqué respuestas
Gracias al Holger
comentario que respondió a mi pregunta, el enfoque de tener un bloque lambda me permitió ver el proceso de transformación y depurar lo que sucedió dentro del cuerpo lambda:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Gracias al Stuart Marks
enfoque de tener referencias de métodos también me permitió depurar el proceso de transformación:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Gracias a la Marlon Bernardes
respuesta, noté que mi Eclipse no muestra lo que debería y el uso de peek () ayudó a mostrar los resultados.
result
variable temporal comoInteger
. Un simpleint
debería funcionar también si está haciendomap
pingint
a unint
…