避免空值检查条件运算符样板的最佳实践

时间:2015-12-05 04:24:26

标签: java java-8 optional

当无法使用null对象时,更换条件运算符null-checks样板的最佳做法是:

public String getEmployeeName() {
    return nullable(employee, employee -> employee.getName());
}

private <T, R> R nullable(T nullable, Function<T, R> doIfNotNull) {
    return nullable == null ? null : doIfNotNull.apply(nullable);
}

在Java 8或任何实用程序库中是否有类似下面的内容?

               <?php
    require_once 'DB_Functions.php';
    $db = new DB_Functions();

    // json response array
    $response = array("error" => false);
    if (!empty($_POST['fname']) && !empty($_POST['lname']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['mobile'])){
        // receiving the post params
        $fname = trim($_POST['fname']);
        $lname = trim($_POST['lname']);
        $email = trim($_POST['email']);
        $password = $_POST['password'];
        $mobile = trim($_POST['mobile']);

        // validate your email address
        if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
            // valid email address
            if ($db->isUserExisted($email)) {
                // user already existed
                $response["error"] = true;
                $response["error_msg"] = "User already existed with " . $email;
                echo json_encode($response);
            } else {
                // create a new user
                $user = $db->storeUser($fname, $lname, $email, $password, $mobile);
                if ($user) {
                    // user stored successfully
                    $response["error"] = false;
                    $response["uid"] = $user["id"];
                    $response["user"]["fname"] = $user["fname"];
                    $response["user"]["lname"] = $user["lname"];
                    $response["user"]["email"] = $user["email"];
                    $response["user"]["created_at"] = $user["created_at"];
                    $response["user"]["updated_at"] = $user["updated_at"];
                    echo json_encode($response);
                } else {
                    // user failed to store
                    $response["error"] = true;
                    $response["error_msg"] = "Unknown error occurred in registration!";
                    echo json_encode($response);
                }
            }
        } else {
            // invalid email address
            $response["error"] = true;
            $response["error_msg"] = "invalid email address";
            echo json_encode($response);
        }
    } else {
        $response["error"] = true;
        $response["error_msg"] = "Required parameters are missing!";
        echo json_encode($response);
    }
?>

3 个答案:

答案 0 :(得分:5)

我发现return employee == null ? null : employee.getName();是最具可读性的,所以也许它是更好的解决方案,而不仅仅是让你的代码过于复杂。它完成了工作,并没有任何问题 - 所以不妨使用它。这就是条件运算符的用途。

通常在尝试决定使用哪种编程模式时,最好使用最易读且最容易让代码的维护者理解的模式。

答案 1 :(得分:4)

您可以将代码重构为:

public String getEmployeeName() {
    return Optional.ofNullable(employee).map(Employee::getName).orElse(null);
}

ofNullable从给定员工中创建Optional值:如果是null,则返回空Optional;否则返回包含该员工的Optional。然后,使用map将此Optional映射到员工的姓名,如果Optional非空且为空,则会返回应用了给定映射器的新Optional如果Optional为空,则Optional。最后,orElse会返回员工的姓名,nullOptional为空。

话虽如此,我认为将此代码放在null - 检查和条件运算符上没有任何附加值:它可能会有更好的性能,也可能更容易阅读。

答案 2 :(得分:-1)

Java 8具有新的Optional类,例如

employee

null永远不会是getEmployeeName(),但可能是&#34;空&#34;。

然后可以通过两种方式实现// Returning Optional (never null) public Optional<String> getEmployeeName() { return this.employee.map(Employee::getName); } // Standard getter (may return null) public String getEmployeeName() { return this.employee.map(Employee::getName).orElse(null); } 方法:

newData.second