for-Schleife mit einer lambda-Ausdrucks in JAVA
Mein Code:
List<Integer> ints = Stream.of(1,2,4,3,5).collect(Collectors.toList());
ints.forEach((i)-> System.out.print(ints.get(i-1)+ " "));
out put:
1 2 3 4 5
meine Frage ist, warum muss ich i-1 innerhalb der get-Methode? ist i-1 verhindern, dass die out-of-boundary-Problem?
Nicht unter code verhält sich wie die for-Schleife die iteration?
(i)-> System.out.print(ints.get(i-1))
so ist obige code entspricht dieser
for(Ineger i:ints)
System.out.print(ints.get(i));
- da die Liste Indizes sind 0-basiert in Java. Aber +1 für Sie eine Frage über "Lambada s"!
- Ich bin Recht cuz es prüft die Begrenzung der Liste auf diese Weise?
- Wert von i ist jedes Mitglied der Liste
- Ihre Letzte Codeausschnitt würde das gleiche problem haben: Sie tun müssen
ints.get(i-1)
zu bekommen, dass so gut funktionieren. - mögliche Duplikate von For-Schleife mit Lambda-Ausdrucks in JAVA
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den lambda-parameter
i
übernimmt den Wert der Elemente in der collection, nicht die Indizes. Sie werden subtrahieren1
weil die Werte zufällig einer höher als Ihr index.Wenn Sie versucht, mit
Ihnen finden würde, der code funktioniert nicht so gut.
Sollten Sie in der Lage sein, einfach das zu tun (nicht, dass zu tun, eine
get
nennen)Ihren lambda und Ihre vorgeschlagenen for-Schleife sind nicht gleichwertig.
Wäre äquivalent zu
Hinweis die Erhaltung der minus 1.
Antwort auf den Kommentar:
Lambdas nicht Schleifen, Sie sind Funktionen (effektiv sowieso). In deinem ersten Beispiel die
forEach
Methode ist, was bietet die looping-Funktionen. Das argument lambda ist, was es sollte tun, die bei jeder iteration. Dies entspricht der Körper deine for-SchleifeIn dem Beispiel in den Kommentar
max
ist die Funktion, die die Schleife wie Verhalten. Es wird die Iteration (do-Schleife) der Elemente zu finden der maximale Wert). Die lambda-Sie bieteni -> i
wäre ein identity-Funktion. Es nimmt einen parameter und gibt das Objekt unverändert.Angenommen, Sie hätten ein komplexeres Objekt, und Sie wollte, Sie zu vergleichen, der auf ein bestimmtes Element wie
GetHighScore()
. Dann könnten Siei -> i.GetHighScore()
um das Objekt mit der höchsten Punktzahl.max
Funktion. Ich sehe, während ich schrieb, kam es Kommentar wurde entfernt. Nicht sicher, ob die Inhalte für Sie hilfreich sind oder nicht.min
/max
genau; implizite iteration. Ich bin nicht sicher, ob es die Ausnahme von dieser Regel für bestimmte Arten. Zum Beispiel in .NET, die Sie tun könnenMin
gegen bestimmte Arten und es werden in einer SQL Abfrage anstatt einer Schleife. Nicht sicher, ob Java-äquivalente (noch) nicht. Für so etwas wie eineList
dann müsste es ja immer eine vollständige iteration fürmin
/max
min
undmax
eine interne iteration für unsortierte streams oder teilweise mehrere Iterationen für parallele streams, aber für streams, die sind schon sortiert in Bezug auf die gleiche Reihenfolge, es kann einfach wieder die erste resp. letztes element in den stream.get
wie @vossad01 angegeben), wie diese:ints.forEach((i)-> System.out.print((i-1)+ " "));
Liste von Indizes in Java sind 0-basiert.
Daher:
Du bist Aufruf von int-Werten.get(i-1) für jedes "ich" wo "ich" ist gleich dem Wert jedes element in der Liste "ints".
Wenn Sie rufen
ints.get(i)
würde Sie abholen Elemente mit Indizes gleich 1,2,3,4 und 5 und 5 wäre nicht ein Gültiger index in einer Liste mit 5 Elementen.Diese code:
ist äquivalent zu:
Ihre Beispiele sind nicht gleichwertig.