Skip to content

Commit 16c0a1f

Browse files
authored
Allow to define value mapper for toMap collector (#87)
* Remove to array casts * Allow to define value mapper for toMap collector
1 parent 8f9ebc9 commit 16c0a1f

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

src/Collection/GenericList.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ public function map(callable $mapper): self
7979
public function flatMap(callable $mapper)
8080
{
8181
$list = self::empty();
82-
foreach ($this->toArray() as $value) {
83-
foreach ($mapper($value)->toArray() as $mapped) {
82+
foreach ($this as $value) {
83+
foreach ($mapper($value) as $mapped) {
8484
$list = $list->prepend($mapped);
8585
}
8686
}

src/Collection/Stream/Collectors.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ public static function toSet(): Collector
3838

3939
/**
4040
* @template T
41+
* @template U
4142
*
42-
* @param callable(T):string $keyProvider
43+
* @param callable(T):string $keyMapper
44+
* @param ?callable(T):U $valueMapper
4345
*
4446
* @return Collector<T,Map>
4547
*/
46-
public static function toMap(callable $keyProvider): Collector
48+
public static function toMap(callable $keyMapper, ?callable $valueMapper = null): Collector
4749
{
48-
return GenericCollector::of(Map::empty(), /** @param T $value */ function (Map $map, $value) use ($keyProvider): Map {
49-
return $map->put($keyProvider($value), $value);
50+
$valueMapper ??= fn ($value) => $value;
51+
52+
return GenericCollector::of(Map::empty(), /** @param T $value */ function (Map $map, $value) use ($keyMapper, $valueMapper): Map {
53+
return $map->put($keyMapper($value), $valueMapper($value));
5054
});
5155
}
5256

tests/Collection/Stream/CollectorsTest.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,25 @@ public function testToSetCollector(): void
2727
self::assertTrue(Set::of(1, 2, 3, 4, 5)->equals($set));
2828
}
2929

30-
public function testToMapCollector(): void
30+
public function testToMapWithDefaultValueMapperCollector(): void
3131
{
32-
$map = Stream::from(1)->take(3)->collect(Collectors::toMap(function (int $value): string {return (string) $value; }));
32+
$map = Stream::from(1)->take(3)->collect(Collectors::toMap(
33+
fn (int $value): string => (string) $value
34+
));
3335

3436
self::assertTrue(Map::fromArray(['1' => 1, '2' => 2, '3' => 3])->equals($map));
3537
}
3638

39+
public function testToMapCollector(): void
40+
{
41+
$map = Stream::from(1)->take(3)->collect(Collectors::toMap(
42+
fn (int $value): string => (string) $value,
43+
fn (int $value): int => $value * 2,
44+
));
45+
46+
self::assertTrue(Map::fromArray(['1' => 2, '2' => 4, '3' => 6])->equals($map));
47+
}
48+
3749
public function testSummingCollector(): void
3850
{
3951
self::assertEquals(15, Stream::from(1)->take(5)->collect(Collectors::summing()));

0 commit comments

Comments
 (0)