我有一些方法列表,这些方法带有Supplier<T>
自变量,用于返回不同类型的默认值。但是,在某些情况下,我需要抛出异常(未经检查)而不是值。
当前,我必须为每个函数定义传递lambda,但是我想创建用于抛出异常的供应商实例,然后在所有函数定义中重新使用它。
我有以下代码:
public static void main(String[] args)
{
testInt("Key1", 10, () -> 99);
testInt("Key2", -19, () -> 0);
testInt("Key3", null, () -> {
throw new UnsupportedOperationException(); //repetition
});
testBoolean("Key4", true, () -> Boolean.FALSE);
testBoolean("Key5", null, () -> {
throw new UnsupportedOperationException();//repetition
});
}
static void testInt(String key, Integer value, Supplier<Integer> defaultValue)
{
if (value != null)
System.out.printf("Key : %s, Value : %d" + key, value);
else
System.out.printf("Key : %s, Value : %d" + key, defaultValue.get());
}
static void testBoolean(String key, Boolean value, Supplier<Boolean> defaultValue)
{
if (value != null)
System.out.printf("Key : %s, Value : %d" + key, value);
else
System.out.printf("Key : %s, Value : %d" + key, defaultValue.get());
}
但是我正在做类似的事情:
final static Supplier<?> NO_VALUE_FOUND = () -> {
throw new UnsupportedOperationException();
};
testInt("Key3", null, NO_VALUE_FOUND);
testBoolean("Key5", null,NO_VALUE_FOUND);
对此表示感谢。 谢谢。
答案 0 :(得分:4)
使用一种方法将NO_VALUE_FOUND值转换为适当的类型:
static <T> Supplier<T> NO_VALUE_FOUND() {
return (Supplier<T>) NO_VALUE_FOUND;
}
public static void main(String[] args) {
testInt("Key3", null, NO_VALUE_FOUND());
testBoolean("Key5", null,NO_VALUE_FOUND());
}
答案 1 :(得分:4)
类似于@ jon-hanson的答案,您可以定义一种直接返回lambda的方法,而无需强制转换:
private <T> Supplier<T> noValueFound() {
return () -> {
throw new UnsupportedOperationException();
};
}
答案 2 :(得分:3)
更好的是,您可以使用更通用的实现,例如:
static <T> void test(String key, T value, Supplier<T> defaultValue) {
if (value != null)
System.out.println("Key : " + key + " Value " + value); // note the change from printf since that had type specific placeholders
else
System.out.println("Key : " + key + " Value " + defaultValue.get());
}
并进一步用作:
public static void main(String[] args) {
test("Key1", 10, () -> 99);
test("Key2", -19, () -> 0);
test("Key3", null, NO_VALUE_FOUND);
test("Key4", true, () -> Boolean.FALSE);
test("Key5", null, NO_VALUE_FOUND);
}
NO_VALUE_FOUND
为:
final static Supplier<?> NO_VALUE_FOUND = () -> {
throw new UnsupportedOperationException();
};
编辑 (来自注释):如果您尝试将类型NO_VALUE_FOUND
的{{1}}传递给测试函数,并传递任何内容除了将文字值Supplier<?>
作为第二个参数之外,您还会收到编译器错误。
因此,为了解决null以外的其他任何值都可能引发null
的情况,请使用通用实现作为suggested in MikeFHay answer.