【问题标题】:Using streams/ functional programming for multiple arrays in Java 8在 Java 8 中对多个数组使用流/函数式编程
【发布时间】:2015-08-02 02:41:44
【问题描述】:

我有 2 个数组,yz 我想返回一个整数数组,其中result[i] = y[i] - z[i]

代码如下:

static int[] join(int[] y, int[] z) {
    int[] result = new int[Math.min(y.length, z.length)];
    for(int i = 0; i < result.length; ++i) {
        result[i] = y[i] - z[i];
    }
    return result;
}

但是,我想使用 Java 的 8 种函数式编程技术(例如流)来做同样的事情。但是,我知道的所有流函数一次只能用于一个列表。

我该怎么做?

编辑 另外我怎么能做我提到的同样的事情,但我想返回一个布尔数组,其中:result[i] = y[i] == 5 || z[i] == 10

【问题讨论】:

  • 通常并行列表/数组有异味。为什么你没有像YZ[](或者更好的List&lt;YZ&gt;)这样的数组,比如class YZ {int y, z;}?为什么你需要得到的int[]boolean[] 数组?你打算如何进一步使用它?通常只有在不需要切换到流的低级数学库(如矩阵处理)中才可以使用并行数组......

标签: java functional-programming java-8 java-stream


【解决方案1】:

您可以使用IntStream模拟带有计数器变量的迭代:

static int[] join(int[] y, int[] z) {
    int min = Math.min(y.length, z.length);
    return IntStream.range(0, min).map(i -> y[i] - z[i]).toArray();
}

【讨论】:

  • 如果我想返回一个布尔数组怎么样(见编辑的问题)。到目前为止很好的解决方案!
  • @YahyaUddin 对于boolean[] 结果,for 循环方法更可取,因为没有BoolStream,据我所知,没有办法轻松转换Stream&lt;Boolean&gt;boolean[]
【解决方案2】:
static int[] join(int[] y, int[] z) {
    int[] result = new int[Math.min(y.length, z.length)];
    for(int i = 0; i < result.length; ++i) {
        result[i] = y[i] - z[i];
    }
    return result;
}

执行此操作的一种速记方法是将 for 循环替换为以下内容:

    Arrays.setAll(result, i -> y[i] - z[i]);

不幸的是,如果结果是 boolean[],则无法执行此操作,因为 Arrays.setAll 的原始特化仅适用于通常的 intlongdouble

但这里没有魔法; Arrays.setAll 只是使用 IntStream.range() 来实现对所有数组索引的聚合操作。因此:

static boolean[] join(int[] y, int[] z) {
    boolean[] result = new boolean[Math.min(y.length, z.length)];
    IntStream.range(0, result.length)
             .forEach(i -> result[i] = y[i] == 5 || z[i] == 10);
    return result;
}

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 2018-07-01
    • 2023-04-09
    • 2020-10-05
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多