我有一个InputStream可以加载属性文件。通常我使用properties.load(is);
,但是我想将其更改为Consumer,因为我希望避免使用catch,因此我创建了一个避免id的ThrowingConsumer,但是问题是,即使我使用普通的Consumer似乎也可以正常工作我声明这将是一个InputStream,但是我的ThrowingConsumer是通用的,因此看起来像
@FunctionalInterface
public interface ThrowingConsumer<T, E extends Throwable>
{
void accept(T t) throws E;
static <T, E extends Throwable> Consumer<T> unchecked(ThrowingConsumer<T, E> consumer)
{
return t ->
{
try
{
consumer.accept(t);
}
catch (Throwable e)
{
throw new UnsupportedOperationException(e);
}
};
}
}
当我使用ThrowingConsumer.unchecked(properties::load).accept(is);
时,尖叫着无法解决方法负载。我该如何避免呢?
答案 0 :(得分:3)
load()方法已重载,因此无法在两个重载之间进行选择。
使用lambda:
ThrowingConsumer.unchecked((InputStream i) -> properties.load(i)).accept(is);
或将您的方法引用转换为正确的类型:
ThrowingConsumer.unchecked((ThrowingConsumer<InputStream, IOException>) properties::load).accept(is);
坦率地说,我认为您是在滥用消费者,而且一个很好的老式try catch块会使事情更容易阅读。当您无法从InputStream读取时,UnsupportedOperationException也不是要加载的正确异常。 UncheckedIOException将更加整洁。您的使用者还捕获了它不应该捕获的异常(例如NullPointerException或OutOfMemoryError等),甚至没有链接到原始原因,这使得在运行时很难诊断问题。