Один из способов сделать это - воспользоваться плоской картой Котлина и групповыми вызовами. Создав список всех пассажиров во всех поездках, вы можете сгруппировать их, сосчитать и вернуть тех, у кого более определенного числа.
Предполагается, что у вас есть такие классы данных (только основные данные):
data class Passenger(val id: Int)
data class Trip(val passengers: List<Passenger>)
Я смог написать это:
fun List<Trip>.frequentPassengers(minTrips: Int): Set<Passenger> =
this
.flatMap { it.passengers }
.groupingBy { it }
.eachCount()
.filterValues { it >= minTrips }
.keys
Это хорошо, потому что это одно выражение. Проходя через это, мы смотрим на каждый Trip
и извлекаем все его Passengers
. Если бы мы только что сделали map
здесь, у нас было бы List<List<Passenger>>
, но мы хотим List<Passenger>
, поэтому мы планируем это для достижения цели. Затем мы groupBy
сами Passenger
объекты и вызываем eachCount()
для возвращенного объекта, давая нам Map<Passenger, Int>
. Наконец, мы отфильтровываем карту по интересующим нас Пассажирам и возвращаем набор ключей.
Обратите внимание, что я переименовал вашу функцию, List
уже имеет filter
на ней, и хотя подписи отличаются, я нашел это сбивающим с толку.