Java 8:如何使用静态方法作为另一种方法的参数?

时间:2017-10-03 07:55:52

标签: java lambda syntax java-8

我的情况:

class Test {
    private static void xxx(String s) throws SQLException {
        System.out.println(s);
    }
    private static void yyy(Consumer<String> f) {
        try {
            f.apply('hello');
        } catch (SQLException e) {
            System.out.println("error");
        }
    }
    public static void main(String args[])() {
        yyy(xxx);  // <-- not working!!
    }
}

我尝试做的是将静态方法作为另一个静态方法的参数传递。我认为声明方法yyy的签名的正确方法是Consumer,但我不确定另一部分,将xxx作为参数传递。

我找到的可能解决方案是写

yyyy(s -> xxx(s));

但它看起来很难看,如果xxx抛出异常,它就不会起作用。

使用

yyy(Test::xxx);

我收到了这个错误

error: incompatible thrown types SQLException in method reference

2 个答案:

答案 0 :(得分:2)

您可以使用方法参考:

class Test {
    private static void xxx(String s) {
        //do something with string
    }
    private static void yyy(Consumer<String> c) {
        c.accept("hello");
    }
    public static void zzz() {
        yyy(Test::xxx);
    }
}

答案 1 :(得分:1)

您可以尝试以下代码

class Test {
    private static Consumer<String>  xxx(String s) {
        //do something with string
        return null;// return Consumer for now passing null
    }

    private static void yyy(Consumer<String> f) {
        //do something with Consumer
    }

    public static void zzz(){
        yyy(xxx("hello")); 
    }
}