In i02302 Index mit Stream.map nach Java 8 hinzufügen wurde beschrieben, wie jedem Element von Stream ein Index hinzugefügt wird.
Als ich es zum ersten Mal sah, verwendete ich ein Array für den Indexzähler, und ich dachte, es wäre besser, eine atomare Ganzzahl unter Berücksichtigung paralleler Streams zu verwenden ... aber als ich es früher sah, änderte sich das (lacht).
Wenn Sie danach BiFuntion verwenden, ist der Indexteil von int Integer. Ich denke, es ist besser, Ihre eigene Funktionsschnittstelle vorzubereiten.
public interface BiIntFunction<T, R> {
public R apply(T t, int n);
}
public class WithIndex {
public static <T, R> Function<T, R> apply(int start, BiIntFunction<T, R> function) {
AtomicInteger counter = new AtomicInteger(start);
return object -> function.apply(object, counter.getAndAdd(1));
}
}
stream.map(WithIndex.apply(1, (obj, i) -> obj + i))
Scalas zipWithIndex gibt ein Element-Index-Paar (Taple) zurück, es ist also dasselbe. Ich denke, es gibt auch einen Weg, dies zu tun.
public class ObjectIndexPair<T> {
private final T object;
private final int index;
private ObjectIndexPair(T object, int index) {
this.object = object;
this.index = index;
}
public T getObject() {
return object;
}
public int getIndex() {
return index;
}
public static <T> Function<T, ObjectIndexPair<T>> start(int start) {
AtomicInteger counter = new AtomicInteger(start);
return object -> new ObjectIndexPair<>(object, counter.getAndAdd(1));
}
}
stream.map(ObjectIndexPair.start(1)).map(pair -> pair.getObject() + pair.getIndex())
Recommended Posts