Java 8 wird für jede erste index
Jemand weiß, wie das zu erreichen ist Folgendes Stück code in einer Java-8-Wege-beziehungsweise gibt es irgendeine stream-Methoden zu erkennen, das erste element in einer forEach?
List<String> myList = new ArrayList<String>();
myList.add("A");
myList.add("B");
int i = 0;
for (final String value : myList) {
if (i == 0) {
System.out.println("Hey that's the first element");
}
System.out.println(value);
i++;
}
Java8:
myList.stream().forEach(value -> {
//TODO: How to do something special for first element?
System.out.println(value);
});
Darüber hinaus lassen Sie ' s sagt, dass das Ziel der folgenden (console output):
A Something special
B
C
D
E
F
- Tun Sie etwas bestimmtes für ein element wäre einfacher (und besser geeignete) mit nur
doSomethind(list.get(0))
+ loop/Strom für die ganze Liste. - no ned um eine Schleife oder auch streamen, für immer nur der 1. elememt. das element mit dem index 0
- Fügen Sie eine Ausgabe in der Konsole mockup, um zu versuchen zu erklären, warum das erste element hat, um erkannt zu werden
- Verwenden Sie ein
IntStream
aber dann eher ein Duplikat (eine Kopie) Java-8 forEach mit dem index 😉 - Java8-streams sind Teil der funktionalen Programmierung-Einrichtungen in der JVM. Als solche Betrieb in einem stream sollte stateless sein, aber zu unterscheiden zwischen der ersten oder jedes andere element ist ein Zustand. Also die streams-API ist das falsche Werkzeug für das, was Sie tun möchten.
- Dies ist nicht wirklich geeignet, um mit streams und forEach-Schleife, die dazu bestimmt sind, in Fällen, in denen der Umgang mit alle Elemente sind homogen. Jede Lösung, die Sie kommen könnte wäre sehr künstlich und würde wahrscheinlich brechen, sobald man versucht es mit einem parallelen stream. In anderen Worten, verwenden Sie ein
for
Schleife. - umformulieren von meinem Kommentar... verwenden Sie ein
IntStream
wenn Sie wirklich denken, Sie brauchen eineStream
hier... ansonsten... nicht? - erste
forEach
muss ersetzt werden mitforEachOrdered
. Was dann passiert, wenn Sie Strom aus einem Set? Es gibt keine Garantien, die erste ist tatsächlich die erste. Die meisten richtigen Weg, es zu tun, würde sein, mit Blick auf die absoluten muss-Lesen Sie hier die Antwort Holger : stackoverflow.com/questions/27547519/...; das ist die Verwendung eines benutzerdefinierten Spliterator. - Guter Punkt, @Eugene, thx für den input, absolut
Iterator<String> i=myList.iterator(); if(i.hasNext()) System.out.println("first: " + i.next()); i.forEachRemaining(System.out::println);
- das ist genau das, was ich dachte. Würden Sie hinzufügen, dass, als eine option, um die Antworten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann diese Arbeit für Sie?
Ausgabe:
Alternative:
myList.stream().findFirst().ifPresent(e -> System.out.println("Special: " + e));
stattpeek
... Beachten Sie, dass der javadoc vonfindFirst()
sagt: "Wenn der stream hat keine Begegnung um, dann wird jedes element zurückgegeben werden kann.", aber ok, für geordnete Listen.myList
ist eine Liste, die ist nicht schlecht, bedenkt, dass die OP wollte, aber wenn du (versehentlich?) wechseln Sie zuSet
, wird dies scheitern. Der richtige Weg wäre wohl zu prüfen, die Spliterator fürSIZED
undSUBSIZED
Eigenschaften.Set
wenn man bedenkt, dass er will, um spezielle Aktionen auf erstes element? Die Sätze sind nicht bestellt, würde es keinen Sinn machen in diesem Zusammenhang.Set
speziell macht keinen Sinn, aber Sie glauben gar nicht, wie oft die Menschen wollen genau dieses...Ich glaube nicht, dass es etwas in den stream.
Gibt es mehrere alternativen, die Sie betrachten kann:
Methode 1:
Methode 2:
Wenn Ihre Liste ist schnell für wahlfreien Zugriff (z.B.
ArrayList
), können Sie prüfen:Versuchen StreamEx
Etwas wie
Gibt es keinen Grund, nicht mit einfachen for-Schleife foreach ist schön, aber begrenzt auf Nebenwirkungen.
{"one", "two", "one"}