jimmyoak/optional

2.2.0 2016-10-28 10:22 UTC

This package is auto-updated.

Last update: 2024-09-09 13:27:18 UTC


README

Java 9的java.util.Optional的PHP改进版本。

一些示例

基本用法

示例请求类

class Request
{
    private $date;
    // ... constructor and getter ...
}

optional的示例代码

$date = Optional::ofNullable($request->getDate())
    ->map(function ($dateString) {
        return DateTime::createFromFormat('Y-m-d', $dateString);
    })
    ->orElseGet(function () {
        return new \DateTime();
    });

echo $date->format('Y-m-d');

给定此请求

$request = new Request('1992-10-07');

程序将输出 1992-10-07

如果在请求中指定了null

$request = new Request(null);

则程序将输出默认值,在这种情况下可能是类似 2016-08-19 的值

而不是返回默认值,我们可以抛出异常以处理没有值的情况

$date = Optional::ofNullable($request->getDate())
    ->map(function ($dateString) {
        return DateTime::createFromFormat('Y-m-d', $dateString);
    })
    ->orElseThrow(new \Exception());

在这种情况下

$request = new Request(null);

程序将抛出指定的异常,否则将返回指定的解析日期。

或者

我们可以链式调用Optionality

$findInMemory = function () {
    ...
    return Optional::ofNullable(...);
};

$findInDisc = function () {
    ...
    return Optional::ofNullable(...);
};

$findRemotely = function () {
    ...
    return Optional::ofNullable(...);
};

$optional = $findInMemory()
    ->or($findInDisc)
    ->or($findRemotely);

只有当最后一个optional为空时,回调函数才会执行。例如

$findInMemory = function () {
    echo "Searching in memory...\n";
    return Optional::empty();
};

$findInDisc = function () {
    echo "Searching in disc...\n";
    return Optional::of("Awesome");
};

$findRemotely = function () {
    echo "Searching remotely...";
    return Optional::of("Not so awesome");
};

$findInMemory()
    ->or($findInDisc)
    ->or($findRemotely)
    ->ifPresent(function ($value) {
        echo $value;
    });

将输出

Searching in memory...
Searching in disc...
Awesome

过滤器

$request = new Request('1992-10-07');

$makeDateTime = function ($value) {
    return \DateTime::createFromFormat('Y-m-d', $value);
};

$beforeNow = function (\DateTime $date) {
    return $date->getTimestamp() > (new \DateTime())->getTimestamp();
};

$date = Optional::ofNullable($request->getDate())
    ->map($makeDateTime)
    ->filter($beforeNow)
    ->orElse(new \DateTime());

echo $date->format('Y-m-d');

输出(类似):2016-08-19

当:$request = new Request('2030-01-01'); 输出:2030-01-01

当:$request = new Request(null); 输出:2016-08-19

ifPresent

Optional::ofNullable($request->getDate())
    ->ifPresent(function ($value) {
        echo "It's present: " . $value;
    });

如果有值,将输出:存在值:1992-10-07 否则不执行任何操作。

ifPresentOrElse

类似于ifPresent,但在optional为空时有else回调

Optional::ofNullable($request->getDate())
    ->ifPresentOrElse(function ($value) {
        echo "It's present: " . $value;
    }, function() {
        echo 'No value is present';
    });

如果有值,将输出:存在值:1992-10-07 否则,将输出:没有值

可比较的

返回true

Optional::of('something')->equals(Optional::of('something'));

返回false

Optional::of(5)->equals(Optional::of('something'));

返回true

Optional::empty()->equals(Optional::empty());

返回false

Optional::empty()->equals(Optional::of(5));

__toString

echo (string) Optional::of('something');

输出:Optional[something]

echo (string) Optional::empty();

输出:Optional.empty