是否可以在2个流中应用BiFunction

时间:2019-06-05 01:25:04

标签: java java-stream

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

delayed(f(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

(仅为索引创建int流)。

1 个答案:

答案 0 :(得分:1)

有可能,但是我很难想象这种情况值得。我们在产品上构造一个迭代器,将其转换为拆分器,然后转换为流。

    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);

输出:

1
4
9
16
25

如果您想使用IntStream,我相信您可以自己将Stream<Integer>拆箱。

请注意,如果原始流中元素的数量不同,则较长流中的多余元素将被默认忽略,这可能不是您想要的。请想些更好的东西。