java - 使用消费者时无法解析方法
问题描述
我有一个加载属性文件的 InputStream。通常我使用properties.load(is);
但我想将其更改为消费者,因为我想避免使用捕获,所以我创建了一个避免 id 的 ThrowingConsumer,但问题是即使我使用普通消费者,当我声明它将是一个 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);
它时,它会尖叫无法解决方法加载。我怎么能避免呢?
解决方案
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 等),甚至没有链接原始原因,这使得在运行时诊断问题变得非常困难。
推荐阅读
- .net-core - dotnet 应用程序,指定使用 appsettings 的环境
- diff - 比较两个 tar.gz
- scala - 在一列中嵌套数据
- python - 将 Tkinter 条目存储到新变量中
- jhipster - 在 Jhipster 模块中生成实体
- html - 调整窗口大小而不是挤压它们时将元素推离屏幕
- javascript - ionViewDidEnter 上的 scrollToBottom - 离子
- css - 在忍者表单中选择后隐藏单选按钮并更改框轮廓颜色
- visual-studio - 如何将我的批准添加到静态类 AssignmentMapType
- selenium - 无法通过 Docker 中的 Jenkins 运行硒测试