当前位置: 首页 > 面试题库 >

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

淳于升
2023-03-14
问题内容

在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于对流进行zip处理(这在Dhananjay Nene的Exploring Java8 Lambdas。Part 1教程中进行了说明)。该功能:

创建一个惰性和顺序组合的Stream,其元素是两个流的元素组合的结果。

然而,在b98中,这种现象消失了。实际上,在b98的java.util.stream中Streams甚至无法访问该类。

此功能是否已移动,如果是,我如何使用b98简洁地压缩流?

我想到的应用程序是此Shen的java实现中的,我在其中替换了zip功能。

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


问题答案:

我也需要它,因此我只是从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);
}


 类似资料:
  • 在带有lambda b93的JDK8中,b93中有一个类java.util.Stream.streams.zip,可以用来压缩流(这在Dhananjay Nene编写的Exploring Java8 lambda.Part 1教程中进行了说明)。此功能: 然而,在b98中,这种情况消失了。事实上,B98中的java.util.Stream甚至不能访问类。 这个功能已经移动了吗?如果移动了,我如何使

  • 本文向大家介绍PHP自带ZIP压缩、解压缩类ZipArchiv使用指南,包括了PHP自带ZIP压缩、解压缩类ZipArchiv使用指南的使用技巧和注意事项,需要的朋友参考一下 要使用该PHP扩展类,需要(PHP 5 >= 5.2.0, PECL zip >= 1.1.0),部分方法需要 PHP 5.2.+,且php.ini配置支持zip 对于win系统,直接去掉php_zip.dll 扩展的注释,

  • 问题内容: Gzip格式文件(gzip例如,使用程序创建的文件)使用“放气”压缩算法,该压缩算法与zlib使用的压缩算法相同。但是,使用zlib膨胀gzip压缩文件时,该库将返回Z_DATA_ERROR。 如何使用zlib解压缩gzip文件? 问题答案: python zlib库支持: RFC 1950(zlib压缩格式) RFC 1951(deflate压缩格式) RFC 1952(gzip压缩

  • 我有一个学校作业,要求我接受一个输入流,并使用apache commons压缩库将其压缩成一个字节数组,格式有5种(根据用户规范)。这5种格式是:ZIP、JAR、SEVENZ、BZIP2和gzip。我编写了以下方法以JAR格式压缩输入流,但得到了一个带有字符串“no current entry”的illegalStateException。

  • 我得到无效的zip,当写入文件以下代码: 我将其写入文件的方式是: 我做错了什么?

  • 问题内容: 在Python 2中,此代码是可以的: 但是在Python 3中发生以下错误: 如果删除lambda表达式中的括号,则会发生另一个错误: 也可以使用元组,因为单个lambda参数可在Python 3中使用,但尚不清楚(难以阅读): 如何在Python 3中以正确的方式解压值? 问题答案: 在PEP 3113中 讨论了删除元组拆包的问题。基本上,您无法在Python 3中执行此操作。在标