Fre*_*ers 0 functional-programming swift
我有以下函数(示例),我想以函数方式编写:
func passengerForId(_ id: Int) -> Passenger?
{
for car in cars
{
for passenger in car.passengers
{
if passenger.id == id
{
return passenger
}
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
什么是最好的方式?
我尝试过以下方法:
func passengerForId(_ id: Int) -> Passenger?
{
return cars.first(where: { $0.passengers.contains(where: { $0.id == id } ) })
}
Run Code Online (Sandbox Code Playgroud)
然而,这显然会使包含所请求乘客的车辆返回,而不是乘客本身.
另一个选择是:
func passengerForId(_ id: Int) -> Passenger?
{
let passengers = cars.flatMap { car in car.passengers }
return passengers.first(where: { $0.id == id })
}
Run Code Online (Sandbox Code Playgroud)
要么
func passengerForId(_ id: Int) -> Passenger?
{
return cars.flatMap { car in car.passsengers.filter { $0.id == id }}.first
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎比原始效率低,因为它将循环遍及所有区域.
有一个更好的方法吗?
您可以创建所有乘客的(懒惰)展平集合,并选择第一个匹配的乘客:
func passengerForId(_ id: Int) -> Passenger? {
return cars.lazy.flatMap({ $0.passengers }).first(where: { $0.id == id } )
}
Run Code Online (Sandbox Code Playgroud)