Wenn Sie die java8 forEach-Methode verwenden, möchten Sie möglicherweise einen Index (Seriennummer). Wenn Sie zu diesem Zeitpunkt versuchen, eine Zählervariable zu verwenden, können Sie sie im Lambda nicht aktualisieren, sodass Sie ein Array verwenden müssen.
Ich kann das nicht machen
int i = 1;
java.util.stream.Stream.of("a", "b", "c", "d").forEach(s -> {
System.out.println(i + ": " + s);
i++;
});
Du kannst das
int i[] = { 1 };
java.util.stream.Stream.of("a", "b", "c", "d").forEach(s -> {
System.out.println(i[0] + ": " + s);
i[0]++;
});
In beiden Fällen sind die Aussichten nicht gut, daher möchte ich, dass es so aussieht.
ich möchte das machen
java.util.stream.Stream.of("a", "b", "c", "d").forEach(withIndex((s, i) -> System.out.println(i + ": " + s)));
Erstellen wir also eine Dienstprogrammmethode.
Klassenname und Methodenname sind angemessen
import java.util.function.Consumer;
import java.util.function.ObjIntConsumer;
public class With {
public static <T> Consumer<T> B(int start, ObjIntConsumer<T> consumer) {
int counter[] = { start };
return obj -> consumer.accept(obj, counter[0]++);
}
}
Der Anfangswert kann ebenfalls eingestellt werden.
erledigt
java.util.stream.Stream.of("a", "b", "c", "d").forEach(With.B(1, (s, i) -> System.out.println(i + ": " + s)));
Ausführungsergebnis
1: a
2: b
3: c
4: d
[Achtung] Wenn Sie parallel im Stream ausführen, verwenden Sie bitte forEachOrdered.
das ist alles
Recommended Posts