在带有lambda b93的JDK8中,有一个类java.util.stream.Streams.zip in b93可以用来压缩流(这在教程Exploring Java8 Lambdas. Part 1 by Dhananjay Nene中进行了说明)。此函数:
创建了一个延迟的顺序组合流,其元素是将两个流的元素组合在一起的结果。
然而,在b98中,这一点已经消失了。事实上,在java.util.stream in b98中甚至不能访问Streams
类。
此功能是否已移动,如果已移动,如何使用b98简洁地压缩流?
我心目中的应用程序是in this java implementation of Shen,我在其中替换了
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
具有相当冗长代码的函数(不使用来自b98的功能)。
发布于 2014-05-08 05:43:04
我也需要这个,所以我只是从b93获取源代码并将其放入一个"util“类中。我不得不稍微修改一下它,以便与当前的API一起工作。
作为参考,以下是工作代码(风险自负):
public static<A, B, C> Stream<C> zip(Stream<? extends A> a,
Stream<? extends B> b,
BiFunction<? super A, ? super B, ? extends C> zipper) {
Objects.requireNonNull(zipper);
Spliterator<? extends A> aSpliterator = Objects.requireNonNull(a).spliterator();
Spliterator<? extends B> bSpliterator = Objects.requireNonNull(b).spliterator();
// Zipping looses DISTINCT and SORTED characteristics
int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &
~(Spliterator.DISTINCT | Spliterator.SORTED);
long zipSize = ((characteristics & Spliterator.SIZED) != 0)
? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())
: -1;
Iterator<A> aIterator = Spliterators.iterator(aSpliterator);
Iterator<B> bIterator = Spliterators.iterator(bSpliterator);
Iterator<C> cIterator = new Iterator<C>() {
@Override
public boolean hasNext() {
return aIterator.hasNext() && bIterator.hasNext();
}
@Override
public C next() {
return zipper.apply(aIterator.next(), bIterator.next());
}
};
Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);
return (a.isParallel() || b.isParallel())
? StreamSupport.stream(split, true)
: StreamSupport.stream(split, false);
}
发布于 2014-09-04 22:59:23
zip是protonpack library提供的功能之一。
Stream<String> streamA = Stream.of("A", "B", "C");
Stream<String> streamB = Stream.of("Apple", "Banana", "Carrot", "Doughnut");
List<String> zipped = StreamUtils.zip(streamA,
streamB,
(a, b) -> a + " is for " + b)
.collect(Collectors.toList());
assertThat(zipped,
contains("A is for Apple", "B is for Banana", "C is for Carrot"));
发布于 2017-03-28 09:51:30
如果您的项目中有Guava,则可以使用Streams.zip方法(在Guava 21中添加):
返回一个流,其中每个元素都是将streamA和streamB中每个元素的相应元素传递给function的结果。得到的流将只与两个输入流中较短的一个一样长;如果一个流更长,那么它的额外元素将被忽略。产生的流不能有效地拆分。这可能会损害并行性能。
public class Streams {
...
public static <A, B, R> Stream<R> zip(Stream<A> streamA,
Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
...
}
}
https://stackoverflow.com/questions/17640754
复制相似问题