W naszym projekcie przeprowadzamy migrację do java 8 i testujemy jej nowe funkcje.
W moim projekcie używam predykatów i funkcji Guava do filtrowania i przekształcania niektórych kolekcji przy użyciu Collections2.transform
i Collections2.filter
.
Podczas tej migracji muszę zmienić na przykład kod guava na zmiany java 8. A więc zmiany, które wprowadzam, to:
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);
Do...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Używając guawy, czułem się bardzo komfortowo debugując kod, ponieważ mogłem debugować każdy proces transformacji, ale martwię się, jak na przykład debugować .map(n -> n*2)
.
Używając debuggera, widzę kod, taki jak:
@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];
}
Ale debugowanie kodu nie jest tak proste jak guawa, właściwie nie mogłem znaleźć n * 2
transformacji.
Czy istnieje sposób, aby zobaczyć tę transformację lub sposób na łatwe debugowanie tego kodu?
EDYCJA: Dodałem odpowiedź z różnych komentarzy i opublikowanych odpowiedzi
Dzięki Holger
komentarzowi, który odpowiedział na moje pytanie, podejście z blokiem lambda pozwoliło mi zobaczyć proces transformacji i debugować, co się stało wewnątrz ciała lambda:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Dzięki Stuart Marks
podejściu posiadania referencji do metod umożliwiło mi również debugowanie procesu transformacji:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Dzięki Marlon Bernardes
odpowiedzi zauważyłem, że moje Eclipse nie pokazuje, co powinno, a użycie peek () pomogło wyświetlić wyniki.
result
zmiennej jakoInteger
. Prosty teżint
powinien wystarczyć, jeślimap
wysyłasz pingint
doint
…