gpt4 book ai didi

java - 从功能上遍历图像的惯用方式

转载 作者:行者123 更新时间:2023-11-30 10:54:38 27 4
gpt4 key购买 nike

我正在使用 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);
}
}

也许这只是因为我太习惯命令式编程了,但后者似乎比前者更具可读性。发生以下两件事之一:

  1. 我的代码错了,我是不是用错了方法?如果是这样,代码应该是什么样的?您如何从功能上遍历任何二维数据结构,而不仅仅是图像?
  2. 这实际上是 Java 8 中函数式编程的最佳版本,而这种情况对于函数式编程来说简直是糟糕透顶。

最佳答案

那是因为 IntStream 并不是专门针对遍历像素的。冗长是为了流的力量而牺牲的。尽管功能正常,但它的用途不符合您的需求。

您总是可以创建自己的界面来处理这些杂乱的工作:

class PixelScanner {
public static void scan(BufferedImage image, PixelInspector inspector) {
int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
for(int y = 0; y < image.getHeight(); y++) {
for(int x = 0; x < image.getWidth(); x++) {
int pixel = pixels[x + y * image.getWidth()];
inspector.inspect(pixel);
}
}
}
}

interface PixelInspector {
void inspect(int pixel);
}

然后您可以将其用作:

PixelScanner.scan(image, pixel -> {
// inspect pixel
});

甚至可以添加更多参数来检查,例如该像素位于哪个 (x, y) 位置。您甚至可以包装每个像素以将更多关于它的数据传递给检查器。我还建议使 scan 成为非静态的并改用 PixelScanner 对象。函数式编程很有用,但 OOP 绝对有它的亮点,两者都应该有效使用。

关于java - 从功能上遍历图像的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33590916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com