【发布时间】:2023-03-18 20:56:01
【问题描述】:
我正在使用 Java 8 并尝试编写纯函数式代码。在我最新的项目中,我需要遍历图像中的每个像素并对每个像素执行一些计算。我想出的代码是这样的:
IntStream
.range(0, newImage.getWidth())
.forEach(i -> IntStream
.range(0, newImage.getHeight())
.forEach(n -> {
inspectPixel(i, n, newImage);
})
);
然而,命令式版本是这样的:
for (int i = 0; i < newImage.getWidth(); i++){
for (int n = 0; n < newImage.getHeight(); n++){
inspectPixel(i, n, newImage);
}
}
也许这只是因为我太习惯命令式编程,但后者似乎比前者更具可读性。正在发生以下两种情况之一:
- 我的代码有误,我是不是走错了路?如果是这样,代码应该是什么样的?您如何在功能上遍历任何二维数据结构,而不仅仅是图像?
- 这实际上是 Java 8 函数式程序的最佳版本,而这种情况对于函数式编程来说简直是糟糕透顶。
【问题讨论】:
-
My code is wrong你的代码怎么错了?它不工作吗?如果它不起作用,那是什么问题? -
错误,因为效率不高或不习惯@vincemigh
-
我不明白你在找什么。使用更简单的界面?正如您在问Java是否具有扫描图像像素的功能支持?请更清楚一点,您的问题目前看起来像是“如何改进我的代码”的帖子。如果你不确定什么是对的,你怎么可能知道你错了?据您所知,您可能会以最好的方式做到这一点。如果您询问 JDK 是否带有用于轻松扫描图像中像素的 api,您应该将其放在您的答案中。您始终可以创建自己的界面来降低第二个版本的冗长程度。
-
最好的方法是遍历像素而不是坐标。如果 API 不支持这个,那么实现你自己的迭代器。任何其他 n 维数据结构也是如此。
标签: java image multidimensional-array functional-programming java-8