Заменить дублированный код параметром функции

У меня есть следующий код, который содержит много повторений.

override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { R.id.action_crop -> { val bitmap = capturedReceiptImageView.bitmap val bitmapCropped = BitmapHelper.cropBitmap(bitmap, capturedReceiptImageView.getDimensions()) capturedReceiptImageView.setImageBitmap(bitmapCropped) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_rotate_left -> { val bitmap = capturedReceiptImageView.bitmap val bitmapRotated = BitmapHelper.rotateBitmap(bitmap, -90.0f) capturedReceiptImageView.setImageBitmap(bitmapRotated) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_rotate_right -> { val bitmap = capturedReceiptImageView.bitmap val bitmapRotated = BitmapHelper.rotateBitmap(bitmap, 90.0f) capturedReceiptImageView.setImageBitmap(bitmapRotated) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_increase_contrast -> { val bitmap = capturedReceiptImageView.bitmap val bitmapChangedContrast = BitmapHelper.changeBitmapContrast(bitmap, 1.10f) capturedReceiptImageView.setImageBitmap(bitmapChangedContrast) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_decrease_contrast -> { val bitmap = capturedReceiptImageView.bitmap val bitmapChangedContrast = BitmapHelper.changeBitmapContrast(bitmap, 0.90f) capturedReceiptImageView.setImageBitmap(bitmapChangedContrast) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_save -> { val bitmap = capturedReceiptImageView.bitmap BitmapHelper.saveBitmap(bitmap, capturedReceiptUri) } else -> { return false } } return true } 

Я хочу, чтобы много этого дублирования с функцией, которая принимает другую функцию, пропускает функции rotateBitmap changeBitmapContrast и т. Д., Которые должны вызывать это в BitmapHelper и возвращать растровое изображение

Как я могу изменить свой код, чтобы выполнить это?

 fun applyBitmapOperation(imageView: ImageView): ((Bitmap) -> Bitmap) -> Unit { val bitmap = imageView.bitmap return { function -> val resultBitmap = function(bitmap) capturedReceiptImageView.setImageBitmap(resultBitmap) capturedReceiptImageView.invalidate() bitmap.recycle() } } override fun onOptionsItemSelected(item: MenuItem?): Boolean { val apply = applyBitmapOperation(capturedReceiptImageView) when (item?.itemId) { R.id.action_crop -> { apply { bitmap -> BitmapHelper.cropBitmap(bitmap, capturedReceiptImageView.getDimensions()) } } R.id.action_rotate_left -> { apply { bitmap -> BitmapHelper.rotateBitmap(bitmap, -90.0f) } } R.id.action_rotate_right -> { apply { bitmap -> BitmapHelper.rotateBitmap(bitmap, 90.0f) } } R.id.action_increase_contrast -> { apply { bitmap -> BitmapHelper.changeBitmapContrast(bitmap, 1.10f) } } R.id.action_decrease_contrast -> { apply { bitmap -> BitmapHelper.changeBitmapContrast(bitmap, 0.90f) } } R.id.action_save -> { val bitmap = capturedReceiptImageView.bitmap BitmapHelper.saveBitmap(bitmap, capturedReceiptUri) } else -> { return false } } return true } 

Я смог заставить это работать со следующим.

  private fun applyBitmapOperation(predicate: KFunction2<@ParameterName(name = "bitmap") Bitmap, @ParameterName(name = "changeAmount") Float, Bitmap>, changeAmount: Float) { val bitmap = capturedReceiptImageView.bitmap val bitmapChanged = predicate.invoke(bitmap, changeAmount) capturedReceiptImageView.setImageBitmap(bitmapChanged) capturedReceiptImageView.invalidate() bitmap.recycle() } 

И назовите это вот так ..

 applyBitmapOperation(::changeBitmapContrast, 1.10f) 
Intereting Posts
Измените фильтр цветного элемента элемента навигации и измените изображение, которое использует одинаковый идентификатор изображения Kotlin добавляет пользовательский прослушиватель для доступа к виджетам на Android В чем разница между этими способами для определения функций? Фильтровать подстроку в котлин Трансляционный приемник не получит намерения Как вернуть значение из функции в kotlin Kotlin + Mockito: получение нулевого Как сделать многосвязывание с помощью контейнера поиска зависимостей Kodein? Инъекция экземпляра не работает с Kotlin & Guice NullPointerException в Android Studio 3 Beta 1 Точка останова не попадает внутрь обратного вызова Kotlin в Intellij Почему я могу использовать имя выражения лямбда, но не имя функции? Kotlin повторяемые @annotations не работают на jdk-8 Использование в операторе для сравнения строки с диапазоном строк Могу ли я создать метод расширения Kotlin для добавления rxJava-подписки на композитную подписку?