迭代器集合包装器

v1.1.0 2017-09-11 03:30 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:09:20 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version License

是什么

Lazy 是一种类似于集合的包装器,可以逐个元素操作迭代器(按需)。

一些注意点

  1. Lazy 对于单次数据源(例如 Generator)效果很好。
  2. Lazy 支持运行开销最小的算法。函数式算法非常适合此用途。
  3. Lazy 集合可以使用 ->eager() 将底层数据源转换为数组。适用于迭代目的。
  4. 具有方便的方法进行简单的懒加载数据生成(例如范围)
  5. 具有高阶集合代理,允许代码如下: $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。