[Ajouter un index avec Stream.map après Java 8] de i02302 (https://qiita.com/i02302/items/4e4cc1ec68c3a91253bb) a décrit comment ajouter un index à chaque élément de Stream.
Quand je l'ai vu pour la première fois, j'utilisais un tableau pour le compteur d'index, et j'ai pensé qu'il serait préférable d'utiliser un entier atomique en tenant compte des flux parallèles ... mais quand je l'ai vu plus tôt, cela a changé (rires).
Après cela, si vous utilisez BiFuntion, la partie index de int sera Integer, donc je pense qu'il est préférable de préparer votre propre interface fonctionnelle.
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))
[ZipWithIndex] de Scala (http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#zipWithIndex) renvoie une paire élément-index (taple), donc c'est la même chose. Je pense qu'il y a aussi un moyen de le faire.
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