A colleague moving between Python and Java asked me if there were an implementation of zip. Handling arbitrary tuples is challenging in Java, but the simple 2-tuple is straight-forward enough:
public final class Pair<T, U> {
public final T first;
public final U second;
public static <T, U> Pair<T, U> pair(final T first, final U second) {
return new Pair<T, U>(first, second);
}
private Pair(final T first, final U second) {
this.first = first;
this.second = second;
}
}
public final class Zipper {
public static <T, U> Iterable<Pair<T, U>> zip(
final T[] first, final Iterable<U> second) {
return zip(asList(first), second);
}
public static <T, U> Iterable<Pair<T, U>> zip(
final Iterable<T> first, final U[] second) {
return zip(first, asList(second));
}
public static <T, U> Iterable<Pair<T, U>> zip(
final T[] first, final U[] second) {
return zip(asList(first), asList(second));
}
public static <T, U> Iterable<Pair<T, U>> zip(
final Iterable<T> first, final Iterable<U> second) {
return new Iterable<Pair<T, U>>() {
@Override
public Iterator<Pair<T, U>> iterator() {
return new Iterator<Pair<T, U>>() {
private final Iterator<T> fit
= first.iterator();
private final Iterator<U> sit
= second.iterator();
@Override
public boolean hasNext() {
return fit.hasNext() && sit.hasNext();
}
@Override
public Pair<T, U> next() {
return pair(fit.next(), sit.next());
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
private Zipper() {
}
}I found several functional Java libraries but none as simple as my colleague wanted.
No comments:
Post a Comment