Это отличный вопрос, так как я думаю, что решение, которое вы предоставили, является идиоматическим решением! Императивная модель действительно соответствует этой проблеме. Я пытался найти простое функциональное решение, которое хорошо читается, но я не смог этого сделать.
Я думаю, что тот, у которого pix.grouped (3), довольно хорош, но я не уверен, что он лучше, чем у вас.
Мое собственное "не обязательное" решение включает определение класса дел с помощью оператора / метода +:
import java.awt.image.Raster
import java.awt.Color
def calculateColorFromRaster(raster:Raster): Color = {
val minX = raster.getMinX()
val minY = raster.getMinY()
val height = raster.getHeight()
val width = raster.getWidth()
val numPixels = height * width
val numChannels = raster.getNumBands()
val pixelBuffer = new Array[Int](width*height*numChannels)
val pixels = raster.getPixels(minX,minY,width,height,pixelBuffer)
// pixelBuffer now filled with r1,g1,b1,r2,g2,b2,...
// If there's an alpha channel, it will be r1,g1,b1,a1,r2,... but we skip the alpha
// This case class is only used to sum the pixels, a real waste of CPU!
case class MyPixelSum(r: Int, g: Int, b: Int){
def +(sum: MyPixelSum) = MyPixelSum(sum.r +r, sum.g + g, sum.b + b)
}
val pixSumSeq= 0 until numPixels map((i: Int) => {
val redOffset = numChannels * i
MyPixelSum(pixels(redOffset), pixels(redOffset+1),pixels(redOffset+2))
})
val s = pixSumSeq.reduceLeft(_ + _)
new Color(s.r / numPixels, s.g / numPixels, s.b / numPixels)
}