Dans notre projet, nous migrons vers java 8 et nous testons ses nouvelles fonctionnalités.
Sur mon projet, j'utilise des prédicats et des fonctions Guava pour filtrer et transformer certaines collections en utilisant Collections2.transformet Collections2.filter.
Sur cette migration, j'ai besoin de changer par exemple le code goyave en changements java 8. Donc, les changements que je fais sont du genre:
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);
À...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
En utilisant guava, j'étais très à l'aise pour déboguer le code car je pouvais déboguer chaque processus de transformation, mais mon souci est de savoir comment déboguer par exemple .map(n -> n*2).
En utilisant le débogueur, je peux voir du code comme:
@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];
}
Mais ce n'est pas aussi simple que Guava de déboguer le code, en fait je n'ai pas trouvé la n * 2transformation.
Existe-t-il un moyen de voir cette transformation ou un moyen de déboguer facilement ce code?
EDIT: J'ai ajouté une réponse à partir de différents commentaires et des réponses publiées
Merci au Holgercommentaire qui a répondu à ma question, l'approche d'avoir un bloc lambda m'a permis de voir le processus de transformation et de déboguer ce qui s'est passé à l'intérieur du corps lambda:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Grâce à Stuart Marksl'approche d'avoir des références de méthode m'a également permis de déboguer le processus de transformation:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Grâce à la Marlon Bernardesréponse, j'ai remarqué que mon Eclipse ne montre pas ce qu'il devrait et l'utilisation de peek () a aidé à afficher les résultats.








resultvariable temporaire commeInteger. Un simpleintdevrait faire aussi bien si vous envoyezmapun pingintà unint…