Если я правильно понял, вы храните каждый отдельный пиксель в одном элементе Stream
, и это может быть неэффективно.Что вы можете сделать, это создать свой собственный класс LazyRaster
, который содержит ленивые ссылки на блоки изображения некоторого размера (например, 20x20).Когда первый блок записывается, соответствующий ему массив инициализируется, и с этого момента изменение пикселя означает запись в этот массив.
Это больше работы, но может привести к повышению производительности.Кроме того, если вы хотите поддерживать наложение операций с изображениями (например, сделать карту - взять - карту), а затем оценить изображение в одноразовом режиме, реализация может стать хитрой - реализация потока является лучшим доказательством этого.
Еще одна вещь, которую можно сделать, - убедиться, что старые Stream
* правильно собраны в мусор .Я подозреваю, что объект image
в вашем примере является оберткой для ваших потоков.Если вы хотите объединить несколько операций с изображениями (например, отображение) и иметь возможность собирать ссылки, которые вам больше не нужны, вы должны убедиться, что у вас нет ссылок на поток - обратите внимание, что это не гарантируется, если:
- у вас есть ссылка на ваше изображение в стеке (
image
в примере) - ваша
Image
оболочка содержит такую ссылку.
Не зная больше о точных случаях использования, трудно сказать больше.
Лично я бы вообще избежал Stream
s и просто использовал бы некоторую неизменную структуру данных на основе массива, которая одновременно экономит пространствои избегает бокса.Единственное место, где я потенциально вижу использование Stream
, - это итеративные преобразования изображений, такие как свертка или применение стека фильтров.У вас не будет Stream
пикселей, а Stream
изображений.Это может быть хорошим способом выразить последовательность преобразований - в этом случае применяются комментарии к gc в приведенной выше ссылке.