Я пытаюсь понять, как правильно использовать класс java.util.Optional
. Учитывая следующий пример кода:
public void doSomething(File destDir, String classifier) throws IOException {
URL resourceRoot = introspectionService.getResourceRoot(pattern);
if (resourceRoot != null) {
JarFile jarFile = (JarFile) resourceRoot.getContent(); //this can throw IOException
... snipped for brevity ...
}
}
, я хотел бы преобразовать этот метод для использования значения Optional<URL>
из службы introspectionService.
public void doSomething(File destDir, String classifier) throws IOException {
Optional<URL> resourceRoot = introspectionService.getResourceRoot(pattern);
resourceRoot.ifPresent(rootUrl-> {
JarFile jarFile = (JarFile) rootUrl.getContent(); //this can throw IOException
... snipped for brevity ...
});
}
Это явно не может быть скомпилировано, потому что подпись of ifPresent () принимает Consumer, который не позволяет генерировать исключения из метода accept ().
Я придумал следующий обходной путь, и мне было интересно, есть ли лучший способ:
public void doSomething(File destDir, String classifier) throws IOException {
Optional<URL> resourceRoot = introspectionService.getResourceRoot(pattern);
Optional<IOException> ioException =
resourceRoot.map(rootUrl-> {
try {
JarFile jarFile = (JarFile) rootUrl.getContent(); //this can throw IOException
... snipped for brevity ...
return null;
}
catch(IOException e) {
return e;
}
});
if (ioException.isPresent()) {
throw ioException.get();
}
}
Есть ли альтернатива лучше?