gpt4 book ai didi

java - 将 Runnable 转换为 Supplier

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:05:19 34 4
gpt4 key购买 nike

如何将 Runnable 转换为 Supplier

public <T> T useSupplier(Supplier<T> supplier) {
// Does something with supplier and returns supplied value
...
return value;
}

public void useRunnable(Runnable runnable) {
// Somehow convert runnable to Supplier
...
useSupplier(supplier);
}

在这里,我想为 useRunnable 重用方法 useSupplier,例如因为我不想重复代码。 useSupplier 的行为对于这个问题并不重要,假设它包装抛出的异常,或者在同步块(synchronized block)中使用供应商。


编辑:澄清一下,useSupplier 方法不与提供的值交互,它只是返回它。 useSupplier 的功能是在某些上下文中从供应商检索值,在我的例子中它捕获(特定的)RuntimeException,创建一个新的异常作为原因和抛出它:

public <T> T useSupplier(Supplier<T> supplier) {
try {
return supplier.get();
}
catch (RuntimeException runtimeException) {
throw new MyException("Supplier threw exception", runtimeException);
}
}

以下解决方案有效(在 Java 8 中):

useSupplier(runnable);
useSupplier(runnable::run);
useSupplier((Supplier<Void>) runnable::run);

我想出的一个解决方案是创建一个新的 Supplier,它返回一个任意值:

useSupplier(() -> {
runnable.run();
return null;
});

有没有更小的解决方案?

编辑:正如 Holger 在评论中指出的那样,使用 runnable::run 也将创建新的 lambda 实例,因为它是有状态的,另请参见 this answer .

最佳答案

在您的情况下,您无法避免创建新对象。即使某处存在将 Runnable 转换为 Supplier 的方法,它也会在那里创建一个对象。所以您的解决方案是有效的,您找不到更好的解决方案。

注意 Supplier 需要提供值,而 Runnable 只是代表一个 Action 。它们用于不同的目的。因此,您需要将 Runnable 转换为 Supplier 可能是涉及设计问题的结果。

关于java - 将 Runnable 转换为 Supplier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618048/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com