从子数组获取单个项目的快速功能方法

时间:2018-10-02 12:19:54

标签: swift functional-programming

我有以下功能(示例),我想以功能性方式编写:

func passengerForId(_ id: Int) -> Passenger?
{
    for car in cars
    {
        for passenger in car.passengers
        {
            if passenger.id == id
            {
                return passenger
            }
        }
    }
    return nil
}

什么是最好的方法?

我尝试了以下操作:

func passengerForId(_ id: Int) -> Passenger?
{
    return cars.first(where: { $0.passengers.contains(where: { $0.id == id } ) })
}

但是,显然返回的是载有所请求乘客的汽车,而不是乘客本身。

另一种选择是:

func passengerForId(_ id: Int) -> Passenger?
{
    let passengers = cars.flatMap { car in car.passengers }
    return passengers.first(where: { $0.id == id })
}

func passengerForId(_ id: Int) -> Passenger?
{
    return cars.flatMap { car in car.passsengers.filter { $0.id == id }}.first
}

但是,这似乎效率不高,因为它将遍历所有区域。

有更好的方法吗?

1 个答案:

答案 0 :(得分:8)

您可以为所有乘客创建一个(懒散的)扁平化集合,然后选择 第一个匹配项:

func passengerForId(_ id: Int) -> Passenger? {
    return cars.lazy.flatMap({ $0.passengers }).first(where: { $0.id == id } )
}