Surprisingly I did not find Python's enumerate
in Guava Iterables.
A little static import and all is well:
import com.google.common.collect.UnmodifiableIterator; import javax.annotation.Nonnull; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Iterator; import java.util.Map.Entry; /** * {@code EnumerateIterable} wraps an iterable like Python {@code enumerate}. * * @author <a href="mailto:binkley@alumni.rice.edu">B. K. Oxley (binkley)</a> */ public final class EnumerateIterable<T> implements Iterable<Entry<Integer, T>> { @Nonnull private final Iterable<T> delegate; public EnumerateIterable(@Nonnull final Iterable<T> delegate) { this.delegate = delegate; } /** * Creates a new enumerated iterable for the given <var>delegate</var>. * * @param delegate the underlying iterable, never missing * @param <T> the underlying wrapped type * * @return the new enumerated iterable, never missing */ @Nonnull public static <T> Iterable<Entry<Integer, T>> enumerate(@Nonnull final Iterable<T> delegate) { return new EnumerateIterable<>(delegate); } @Nonnull @Override public Iterator<Entry<Integer, T>> iterator() { return new EnumerateIterator<>(delegate); } private static final class EnumerateIterator<T> extends UnmodifiableIterator<Entry<Integer, T>> { @Nonnull private final Iterator<T> it; int i; EnumerateIterator(@Nonnull final Iterable<T> delegate) { it = delegate.iterator(); i = 0; } @Override public boolean hasNext() { return it.hasNext(); } @Override @Nonnull public Entry<Integer, T> next() { return new SimpleImmutableEntry<>(i++, it.next()); } } }
UPDATE: Completeness requires a static factory method for arrays as well as iterables.
No comments:
Post a Comment