voltra / lazy-collection
一个用于懒方式操作集合的库
1.0.0
2020-10-10 09:15 UTC
Requires
- php: >=7.1.11
- ext-json: *
Requires (Dev)
- jasny/phpunit-extension: ^0.2.1
- php-mock/php-mock: ^2.2
- php-mock/php-mock-phpunit: ^2.6
- phpunit/phpunit: ^7.5
This package is auto-updated.
Last update: 2024-09-13 02:28:38 UTC
README
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
或类似unique
和sort
的操作被认为是急切操作(或有状态的),因为它们在自身发出值之前需要遍历整个流一次。
关键是,你做的任何操作的成本,在最坏的情况下,与你可以手动编写的内容一样多。