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

标签 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
}

但是,这似乎比原来的效率低,因为它会遍历所有区域。

有更好的方法吗?

最佳答案

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

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

关于从子数组中获取单个项目的快速功能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608213/

相关文章:

swift - Swift 3 中的 Depreciation++ 运算符,寻找解决方法

swift - 全部删除然后保存Core Data中的对象

c++ - 我在这里的绑定(bind)功能做错了什么?

r - 函数运算符和环境

scala - 从不同类运行通用功能的最佳方式

functional-programming - 将随机索引生成到数组中的最佳方法?

ios - MKPolygon 初始化错误 "Missing argument for parameter ' interiorPolygons' in call"/"Extra argument in call"

swift - 在 Swift 中从文本文件中提取数字和字符

haskell - 将集合并集实现为幺半群

ios - 无法将 Firebase 导入 Swift 类