voltra/lazy-collection

一个用于懒方式操作集合的库

1.0.0 2020-10-10 09:15 UTC

This package is auto-updated.

Last update: 2024-09-13 02:28:38 UTC


README

lazy-collection logo

Lazy Collection

一个用于懒方式操作集合的库

composer require voltra/lazy-collection

更多信息,请参阅官方文档或加入我的官方discord服务器以获得库的帮助。

使用该库

use LazyCollection\Stream;

你可以用两种方式使用这个库

  • 使用工厂函数(在LazyCollection命名空间中)
  • 使用工厂静态方法

函数

为你们预先定义了一些函数

  • collect(...$args)从一系列参数创建一个流
  • stream($iterable)创建一个包含给定iterable的流
  • infiniteRange($start, $step)创建一个从$start开始,每次增加$step的无限流
  • range($start = 0, $end = null, $step = 1)创建一个数字范围
  • splitBy($str, $separator, $removeEmptyStrings = true)通过使用$separator$str分割成部分来创建一个字符串流
  • splitByRegex($str, $re, $removeEmptyStrings = true)通过使用正则表达式$re$str分割成部分来创建一个字符串流(参考[preg_split](使用正则表达式在字符串的部分上创建一个流)))

工厂

  • Stream::fromIterable($iterable)
  • Stream::range($start = 0, $end = null, $step = 1)
  • Stream::splitBy($str, $separator, $removeEmptyStrings = true
  • splitByRegex($str, $re, $removeEmptyStrings = true)

扩展库

Stream提供添加方法和工厂的实用工具

  • Stream::registerMethod($name, $method)可以返回一个Stream实例或其它
  • Stream::registerFactory($name, $factory)应该返回一个Stream实例
use LazyCollection\Stream;

Stream::registerMethod("mapTo42", static function(){
    /**
     * @var Stream $this
     */
    return $this->map(static function(){ return 42; });
});

Stream::fromIterable([1, 2, 3])
    ->mapTo42()
    ->toArray(); //-> [42, 42, 42]

Stream::registerFactory("answerToLife", function(){
    $gen = (static function(){
        yield 42;
    })();
    
    return new static($gen, false); // new static($generator, $isAssociative)
    
    /*
    Alternatively:
    
    return static:fromIterable([42]);
    */
});

Stream::answerToLife()->toArray(); //-> [42]

为什么使用这个库

其目标是提供一个具有优雅和流畅语法和性能的独立库,用于集合操作。

由于其设计,以下部分在复杂性方面是严格等价的

$items = [1, 2, 3, 4, 5, 6];
$results = [];

foreach($items as $item){
    $mapped = 3 * $item - 2; // models 3x-2
    if($mapped % 2 === 0)
        $results[] = $mapped;
}

$streamResults = Stream::fromIterable($items)
    ->map(function($x){ return 3 * $x - 2; })
    ->filter(function($x){ return $x % 2 === 0; })
    ->toArray();

// $results is the same as $streamResults

无论你使用多少操作,它始终是O(n)。相当于一个单次循环。

请注意,像reverse或类似uniquesort的操作被认为是急切操作(或有状态的),因为它们在自身发出值之前需要遍历整个流一次。

关键是,你做的任何操作的成本,在最坏的情况下,与你可以手动编写的内容一样多。

徽章

GitHub code size in bytes Packagist Downloads Packagist License GitHub issues GitHub pull requests Packagist Stars Packagist PHP Version Support

forthebadge