java - 使用 java 流将数组拆分为子数组 - 有状态映射器

标签 java arrays lambda java-8 java-stream

我有一个包含 K*N 个元素的 double[]。我想将其分割成一个由 N 个大小为 K 的 long[] 数组组成的流(列表/数组/...)。我已经找到了一个解决方案,但它看起来很脏并且需要一个有状态的映射器(我认为它们的意思是无国籍):

private class DataToLong implements DoubleFunction<long[]> {
    int d = 0;
    long[] buf = new long[K];
    @Override
    public long[] apply(double value) {
        buf[d] = BitTools.toSortableLong(value);
        d++;
        long[] ret = null;
        if (d >= K) {
            ret = buf;
            buf = new long[K];
            d = 0;
        }
        return ret;
    }
}

public void load(double[] data, int K) {
    Arrays.stream(data).mapToObj(new DataToLong())
                            .filter((x)-> x != null).forEach((buf)->{
        //here we do something with 'buf'
    });
}

上面的代码似乎可以工作,但它实际上比非流版本的代码长,并且违反了Mapper的无状态要求。有没有更好的方法来实现同样的目标?

最佳答案

IntStream.range(0, n).mapToObj(
   i -> {
     long[] arr = new long[k];
     for (int j = 0; j < k; j++) {
       arr[j] = BitTools.toSortableLong(data[k * i + j]);
     }
     return arr;
   });

关于java - 使用 java 流将数组拆分为子数组 - 有状态映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172122/

相关文章:

java - 如何将日历对象转换为即时对象?

java - 如何从 fragment 本身中删除 fragment

java - final方法是内联的?

javascript - 在 React 组件中使用 .map 从数据库数组中渲染多个元素?

c#-3.0 - IQueryable<T> 与 IEnumerable<T> 使用 Lambda,该选择哪一个?

c# - 从属性表达式中获取属性的拥有对象

java - 在不能抛出的地方抛出 NullPointerException

java - JaxB 输出格式?

javascript - 数组的数组 - JavaScript

javascript - 如果存在于另一个数组中,则从一个数组中移除字符串