Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在两个流之间应用双函数_Java_Java Stream - Fatal编程技术网

Java 是否可以在两个流之间应用双函数

Java 是否可以在两个流之间应用双函数,java,java-stream,Java,Java Stream,例如,我想要这样的东西: n = {1, 2, 3, 4, 5} m = {1, 2, 3, 4, 5} x = Arrays.stream(n); y = Arrays.stream(n); IntStream.multiply(x,y) // int stream now containing squares 我想避免做以下事情: Intstream.range(0, x.count()) .map(i-> { z= biFunction.apply( x.

例如,我想要这样的东西:

n = {1, 2, 3, 4, 5}
m = {1, 2, 3, 4, 5}
x = Arrays.stream(n);
y = Arrays.stream(n);
IntStream.multiply(x,y) // int stream now containing squares

我想避免做以下事情:

Intstream.range(0, x.count())
.map(i-> {
    z= biFunction.apply(
        x.findFirst().get(),
        y.findFirst().get()
    );
    x.skip(1);
    y.skip(1);
    return z;
})

(仅为索引创建一个int流)。

这是可能的,但我很难想象这样做是值得的。我们在乘积上构造一个迭代器,将其转换为拆分器,然后转换为流

    int[] n = {1, 2, 3, 4, 5};
    int[] m = {1, 2, 3, 4, 5};
    IntStream x = Arrays.stream(n);
    IntStream y = Arrays.stream(m);
    PrimitiveIterator.OfInt nIt = x.iterator();
    PrimitiveIterator.OfInt mIt = y.iterator();

    Iterator<Integer> prodIterator = new Iterator<>() {

        @Override
        public boolean hasNext() {
            return nIt.hasNext() && mIt.hasNext();
        }

        @Override
        public Integer next() {
            // Apply your BiFunction here
            return nIt.next() * mIt.nextInt();
        }
    };

    Iterable<Integer> prodIterable = () -> prodIterator;

    Stream<Integer> productStream = StreamSupport.stream(prodIterable.spliterator(), false);

    productStream.forEach(System.out::println);
如果您想要
IntStream
,我相信您可以自己解除
流的装箱


请注意,如果原始流中有不同数量的元素,较长流中的额外元素将被默认忽略,这可能不是您想要的。请想出更好的办法。

不幸的是,我认为这是不可能的。Java流并不适用于所有计算环境。您必须使用类似于所提供示例的内容(我个人认为这看起来不太糟糕)。流解决方案无疑更优雅,但直接数组访问性能更高。对于本例,您的预期输出是什么?@Tobiq,即使您有这样一个
BiFunction
,例如
Math::multiplyExact
来计算两个数字的乘积。数字的索引必须以某种方式指定。
1
4
9
16
25