thecrypticace / lazy
迭代器集合包装器
v1.1.0
2017-09-11 03:30 UTC
Requires
- php: >=7.0.0
- tightenco/collect: ^5.4
Requires (Dev)
- phpunit/phpunit: ^6.0
- symfony/var-dumper: ^3.2
This package is not auto-updated.
Last update: 2024-09-28 20:09:20 UTC
README
是什么
Lazy 是一种类似于集合的包装器,可以逐个元素操作迭代器(按需)。
一些注意点
- Lazy 对于单次数据源(例如
Generator)效果很好。 - Lazy 支持运行开销最小的算法。函数式算法非常适合此用途。
- Lazy 集合可以使用
->eager()将底层数据源转换为数组。适用于迭代目的。 - 具有方便的方法进行简单的懒加载数据生成(例如范围)
- 具有高阶集合代理,允许代码如下:
$collection->map->people->map->count()->sum()
为什么
假设你有一段这样的代码
collect($oneMillionNumbers)->filter(function ($n) { return $n % 2 === 0; })->map(function ($n) { return $n / 4; })->filter(function ($n) { return $n >= 100; }) ->first()
对于一个小数组 $items,这里执行的工作微不足道。如果你有一个包含从一开头的1百万个数字的大数组,这里执行的工作很大
filter中的 1,000,000 次迭代map中的 500,000 次迭代filter中的 500,000 次迭代first中的 1 次迭代
总计:2,000,001 次迭代,总计:2,000,001 次函数调用
这些迭代中的每一个也都会产生函数调用的开销。
如果你将 collect 的调用替换为 lazy
lazy($oneMillionNumbers)->filter(function ($n) { return $n % 2 === 0; })->map(function ($n) { return $n / 4; })->filter(function ($n) { return $n >= 100; }) ->first()
以下是这些统计数据
filter中的 400 次迭代map中的 200 次迭代filter中的 200 次迭代first中的 1 次迭代
由于这些迭代是按需发生的,所以不是 801 次迭代。对于整个集合来说是 400 次。 Lazy 集合只执行获取结果所需的最少工作量。
总共有 801 次函数调用。每个操作中的每个“虚拟”迭代都有一个。尽管如此,这个数字远小于上面循环中的 2,000,001 次调用。
总计:400 次迭代,总计:801 次函数调用
Lazy 有效地执行了与以下相同的操作
foreach ($oneMillionNumbers as $n) { if ($n % 2 === 0) { $n = $n / 4; if ($n >= 100) { return $n; } } }
提示:lazy_range(1, 1000000) 将生成一个从一到一百万的范围的 Collection。