使用java SE 8中的Optional <t> </t>

时间:2014-11-20 00:32:01

标签: java java-8 optional

您好我想知道如何在下面的函数中使用java SE 8中的Optional。

public URL getAuthenticatedURL() throws MalformedURLException {
    if (log != null){
        log.writeINFOToLog("Fetching authentication URL...");
    }
    else{
        Log.initLog();
        log.writeINFOToLog("Fetching authentication URL...");
    }
    try{
        String url = String.format("%s://%s%s?username=%s&password=%s",getProtocol(), getHost(), getPath(), getUsername(), getPassword());
        URL returnURL = new URL(url);
        return returnURL;
    }
    catch (MalformedURLException ex){
        log.writeExceptionToLog(ex);
        return null;
    }
}

我希望能够处理构造URL所涉及的值为null或为空的场景。

2 个答案:

答案 0 :(得分:0)

我认为使用 Supplier Optional更合理,因为getAuthenticatedURL()没有参数并生成对象(URL)。

看起来像:

Supplier<URL> supplier = () -> {
    ...
    try {
        return new URL(...);
    } catch (MalformedURLException e) {
        return null;
    }
};
URL url = supplier.get();

答案 1 :(得分:0)

经过一些研究,我认为我最好避免使用空值,因为没有空位是没有意义的。

使用Optional<URL>

后,这是我的相同功能的代码段
public Optional<URL> getAuthenticatedURL() throws MalformedURLException {
    if (log != null){
        log.writeINFOToLog("Fetching authentication URL...");
    }
    else{
        Log.initLog();
        log.writeINFOToLog("Fetching authentication URL...");
    }
    String url = String.format("%s://%s%s?username=%s&password=%s",getProtocol(), getHost(), getPath(), getUsername(), getPassword());
    return Optional.ofNullable(new URL(url));
}

因此,当我调用该函数时,代码将是这样的。

if(getAuthenticatedURL.isPresent()){
  URL val = getAuthenticatedURL.get();
}