In unserem Projekt migrieren wir auf Java 8 und testen die neuen Funktionen.
In meinem Projekt verwende ich Guava-Prädikate und -Funktionen, um einige Sammlungen mit Collections2.transform
und zu filtern und zu transformieren Collections2.filter
.
Bei dieser Migration muss ich zum Beispiel Guavencode in Java 8 ändern. Die Änderungen, die ich vornehme, sind folgende:
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);
Zu...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Mit Guave war ich sehr komfortabel beim Debuggen des Codes, da ich jeden Transformationsprozess debuggen konnte, aber mein Anliegen ist beispielsweise das Debuggen .map(n -> n*2)
.
Mit dem Debugger kann ich folgenden Code sehen:
@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];
}
Aber es ist nicht so einfach wie Guava, den Code zu debuggen, eigentlich konnte ich die n * 2
Transformation nicht finden .
Gibt es eine Möglichkeit, diese Transformation zu sehen oder diesen Code einfach zu debuggen?
BEARBEITEN: Ich habe Antworten aus verschiedenen Kommentaren hinzugefügt und Antworten gepostet
Dank eines Holger
Kommentars, der meine Frage beantwortete, ermöglichte mir der Ansatz, einen Lambda-Block zu haben, den Transformationsprozess zu sehen und zu debuggen, was im Lambda-Körper passiert ist:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Dank Stuart Marks
des Ansatzes, Methodenreferenzen zu haben, konnte ich auch den Transformationsprozess debuggen:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Dank der Marlon Bernardes
Antwort bemerkte ich, dass meine Eclipse nicht anzeigt, was sie sollte, und die Verwendung von peek () half, Ergebnisse anzuzeigen.
result
Variable nicht als deklarierenInteger
. Eine einfacheint
sollten auch tun , wenn Sie sindmap
Ping einint
zu einemint
...