Как l oop над картой в Kotlin? - PullRequest
       9

Как l oop над картой в Kotlin?

1 голос
/ 15 апреля 2020

В моем приложении android с Kotlin у меня есть переменная "тип данных" типа Map>, Какой продукт является классом данных kotlin.

var data: Map<String, Array<Product>>

Класс данных продукта содержит переменную availableQuantities. Я хочу l oop Карта> и сохранить только продукт с availableQuantities! = 0 и обновить переменную данных. Как я могу это сделать? Вот мой код

   try {
        val filteredMap: HashMap<String, Array<Product>> = HashMap()
        data.forEach { (key, value) ->
            val filtered = value.filter { prod -> prod.availableQuantities != 0 }
            if (filtered.isNotEmpty()) {
                filteredMap[key] = filtered.toTypedArray()
            }
        }
    } catch (e: Throwable) {
        e.message
    }

Но после запуска кода появляется исключение в виде следующего изображения:

Следующее изображение является описанием данных:

enter image description here

Как я могу исправить свой код, чтобы он стал функциональным?

Ответы [ 5 ]

1 голос
/ 15 апреля 2020

Я думаю, что можно использовать .values.flatten(), чтобы составить плоский список.

  val tempProd = data.values.flatten().filter {
            it.availableQuantities != 0
        }
0 голосов
/ 15 апреля 2020

Я могу подумать о двух случаях. Если вы не хотите хранить пустой список продуктов с ключом.

val filteredMap: HashMap<String, Array<Product>> = HashMap()
data.forEach { (key, value) ->
    val filtered=value.filter {prod-> prod.availableQuantities!=0 }
    if(filtered.isNotEmpty()){
        filteredMap[key]=filtered.toTypedArray()
    }
 }

Или если вы хотите сохранить пустой список с ключом, вы можете попробовать что-то вроде: -

val filteredMap= data.mapValues { (_, value) ->
    value.filter { it.availableQuantities != 0 }.toTypedArray()
}
0 голосов
/ 15 апреля 2020
data = data.mapValues { (_, array) ->
    array.filter { it.availableQuantities != 0 }.toTypedArray()
}
0 голосов
/ 15 апреля 2020

Вместо использования Stream вы могли бы просто воспользоваться функциями расширения kotlin и также избавиться от пустых массивов, используя flatMap {}, чтобы объединить все массивы Product в один список.

Итак, ваш сценарий будет выглядеть так:

val temp = data.values.flatMap { products ->
    products.filter { product ->
        product.quantity != 0
    }
}
0 голосов
/ 15 апреля 2020

Не будет ли что-то подобное этой работой?

val tempProd = StreamSupport.stream(data.values.toMutableList())
            .map{t -> t.filter{
                it.availableQuantities!= 0
            } }

Вы можете получить пустые массивы, так как это массив массивов. Если вам нужен только один массив, вам нужно уменьшить двумерный массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...