首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用带有lambda的JDK8压缩流(java.util.stream.Streams.zip)

使用带有lambda的JDK8压缩流(java.util.stream.Streams.zip)
EN

Stack Overflow用户
提问于 2013-07-14 23:24:54
回答 14查看 86.2K关注 0票数 162

在带有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的功能)。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2014-05-08 05:43:04

我也需要这个,所以我只是从b93获取源代码并将其放入一个"util“类中。我不得不稍微修改一下它,以便与当前的API一起工作。

作为参考,以下是工作代码(风险自负):

代码语言:javascript
复制
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);
}
票数 81
EN

Stack Overflow用户

发布于 2014-09-04 22:59:23

zip是protonpack library提供的功能之一。

代码语言:javascript
复制
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"));
票数 45
EN

Stack Overflow用户

发布于 2017-03-28 09:51:30

如果您的项目中有Guava,则可以使用Streams.zip方法(在Guava 21中添加):

返回一个流,其中每个元素都是将streamA和streamB中每个元素的相应元素传递给function的结果。得到的流将只与两个输入流中较短的一个一样长;如果一个流更长,那么它的额外元素将被忽略。产生的流不能有效地拆分。这可能会损害并行性能。

代码语言:javascript
复制
 public class Streams {
     ...

     public static <A, B, R> Stream<R> zip(Stream<A> streamA,
             Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
         ...
     }
 }
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17640754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档