Last active
September 18, 2016 15:50
-
-
Save d-yoshi/7e2dc8003951d21856bea0dae3e9d11d to your computer and use it in GitHub Desktop.
JavaのStreamにもLINQみたいな機能が欲しかった
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import lombok.AccessLevel; | |
import lombok.AllArgsConstructor; | |
import lombok.NonNull; | |
import java.util.Iterator; | |
import java.util.Spliterator; | |
import java.util.Spliterators; | |
import java.util.function.BiFunction; | |
import java.util.function.Consumer; | |
import java.util.stream.Stream; | |
import java.util.stream.StreamSupport; | |
public final class StreamHelper { | |
public static <T, U, R> Stream<R> zip(@NonNull Stream<T> s1, @NonNull Stream<U> s2, @NonNull BiFunction<T, U, R> mapper, int size) { | |
PairIterator<T, U, R> itr = new PairIterator<>(s1.iterator(), s2.iterator(), mapper); | |
int characteristics = Spliterator.IMMUTABLE | Spliterator.NONNULL; | |
if (size < 0) { | |
return StreamSupport.stream( | |
Spliterators.spliteratorUnknownSize(itr, characteristics), false); | |
} else { | |
return StreamSupport.stream( | |
Spliterators.spliterator(itr, size, characteristics), false); | |
} | |
} | |
public static <T, U, R> Stream<R> zip(@NonNull Stream<T> s1, @NonNull Stream<U> s2, @NonNull BiFunction<T, U, R> mapper) { | |
return zip(s1, s2, mapper, -1); | |
} | |
@AllArgsConstructor(access = AccessLevel.PRIVATE) | |
private static class PairIterator<T, U, R> implements Iterator<R> { | |
private final Iterator<T> i1; | |
private final Iterator<U> i2; | |
private final BiFunction<T, U, R> mapper; | |
@Override | |
public boolean hasNext() { | |
return i1.hasNext() && i2.hasNext(); | |
} | |
@Override | |
public R next() { | |
return mapper.apply(i1.next(), i2.next()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment