Nel nostro progetto stiamo migrando a java 8 e ne stiamo testando le nuove funzionalità.
Nel mio progetto sto usando predicati e funzioni Guava per filtrare e trasformare alcune raccolte usando Collections2.transform
e Collections2.filter
.
In questa migrazione ho bisogno di cambiare ad esempio il codice guava in Java 8 modifiche. Quindi, i cambiamenti che sto facendo sono il tipo di:
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);
Per...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Usando guava sono stato molto a mio agio nel debug del codice poiché potevo eseguire il debug di ogni processo di trasformazione, ma la mia preoccupazione è come eseguire il debug, ad esempio .map(n -> n*2)
.
Usando il debugger posso vedere del codice come:
@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];
}
Ma non è così semplice come Guava eseguire il debug del codice, in realtà non sono riuscito a trovare la n * 2
trasformazione.
C'è un modo per vedere questa trasformazione o un modo per eseguire facilmente il debug di questo codice?
EDIT: ho aggiunto la risposta da diversi commenti e le risposte pubblicate
Grazie al Holger
commento che ha risposto alla mia domanda, l'approccio di avere il blocco lambda mi ha permesso di vedere il processo di trasformazione ed eseguire il debug di ciò che è accaduto all'interno del corpo lambda:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Grazie Stuart Marks
all'approccio di avere riferimenti al metodo mi ha anche permesso di eseguire il debug del processo di trasformazione:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Grazie alla Marlon Bernardes
risposta ho notato che il mio Eclipse non mostra quello che dovrebbe e l'uso di peek () ha aiutato a visualizzare i risultati.
result
variabile temporanea comeInteger
. Un sempliceint
dovrebbe andare bene anche se stai facendomap
un pingint
a unint
...