使用通用供应商抛出未经检查的附件

时间:2019-01-04 10:05:46

标签: java lambda java-8

我有一些方法列表,这些方法带有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);

对此表示感谢。 谢谢。

3 个答案:

答案 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.