回顾将Lambda的C ++ for_each移植到Java

时间:2016-06-27 18:16:34

标签: java c++ lambda

我正在尝试将C ++代码移植到Java。

该片段如下:

uint32_t maxNumSource = newLayer.size.x * newLayer.size.y;
for (auto &plane : newLayer.flatConvolveMatrix) {

    std::for_each(std::begin(plane), std::end(plane), [maxNumSource](float &weight) {
        weight = (float)(((randomFloat() * 2) - 1.0f) / sqrt(maxNumSource));
    });

}

其中flatConvolveMatrix是newLayer的成员,声明如下:

vector<vector<float>> flatConvolveMatrix;

我不确定在C ++中,'weight'变量是如何处理的。进入for_each循环作为参数,对吧? '[maxNumSource]'的含义是什么?

到目前为止,在Java中我提出了:

Integer maxNumSource = newLayer.size.x * newLayer.size.y;
for ( Vector<Double> plane : newLayer.flatConvolveMatrix ) {
    double weight = 0;

    for ( Double value : plane ) {
        weight += randomFloat() * 2 - 1.0 / Math.sqrt(maxNumSource);
    }

}

我的解释是否正确?

1 个答案:

答案 0 :(得分:3)

[maxNumSource]部分是lambda的捕获列表,它允许lambda在其体内使用变量maxNumSource的副本。

不,有一个错误:

C ++版本修改plane中的元素,而Java版本则不修改。它应该是:

for (Double value : plane)
    value = (randomFloat() * 2 - 1.0) / Math.sqrt(maxNumSource);
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
               operator precendence :)
    ^^^^
     modifies the current 'value' in 'plane'