#kotlin #collections
#kotlin #Коллекции
Вопрос:
У меня есть изменяемый список в kotlin, который выглядит следующим образом:
val бакалея = listOf( Еда («апельсин», «фрукт»), Еда («картофель», «овощ»), Еда («банан», «фрукт»), Еда («яблоко», «фрукт»), Еда («огурец», «овощ»),Еда («салат», «овощ») )
я определил закрытый класс, чтобы я мог группировать эти данные:
sealed class RecyclerItem {
data class Food(val name: String): RecyclerItem()
data class Section(val title: String): RecyclerItem()
}
Где раздел будет содержать такие вещи, как «овощ» или «фрукт»
, а еда будет похожа на «банан» или «яблоко»
и т.д. и т.п.
чтобы сгруппировать мои данные в один список, я написал этот код с помощью groupby:
val sectionedGroceries: List<RecyclerItem> = groceries
.groupBy { it.category }
.flatMap { (category, foods) ->
listOf<RecyclerItem>(RecyclerItem.Section(category)) foods.map { RecyclerItem.Food(it.name) }
}
в конце, если я распечатаю список, он будет выглядеть так:
[Section(title=fruit), Food(name=orange), Food(name=banana), Food(name=apple), Section(title=vegetable), Food(name=potato), Food(name=cucumber), Food(name=salad)]
но теперь моя проблема в том, что если в списке есть ТОЛЬКО ОДИН раздел, я хочу удалить его так, чтобы в списке была только еда. как я могу сделать это наиболее эффективно?
обновление извините, вот полный код:
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val groceries = listOf(
Food("orange", "fruit"),
Food("potato", "vegetable"),
Food("banana", "fruit"),
Food("apple", "fruit"),
Food("cucumber", "vegetable"),
Food("salad", "vegetable")
)
val sectionedGroceries: List<RecyclerItem> = groceries
.groupBy { it.category }
.flatMap { (category, foods) ->
listOf<RecyclerItem>(RecyclerItem.Section(category)) foods }
Log.v("TAG","$sectionedGroceries")
}
}
sealed class RecyclerItem {
data class Food(val name: String, val category: String): RecyclerItem()
data class Section(val title: String): RecyclerItem()
}
Комментарии:
1.
Food
имеет только один параметр в вашем запечатанном классе, но в списке бакалеи имеет два. И где этоcategory
определено?2. я обновил код, поэтому теперь он очень понятен. я вставил полный код. я просто хочу удалить все классы данных раздела из конечных результатов, если есть только один раздел, потому что один раздел бессмыслен для моего использования.
Ответ №1:
val sectionedGroceries: List<RecyclerItem> = groceries
.groupBy { it.category }
.let {
if (it.size == 1) it.values.first()
else it.flatMap { (category, foods) ->
listOf(RecyclerItem.Section(category)) foods
}
}
Комментарии:
1. оператор let был моей проблемой, я продолжал думать, что это поток rxjava, когда его нет. его функции kotlin.. Спасибо!