为什么Java 8中的lambda表达式需要在其中使用变量才能使用“最终”修饰符,而在使用方法引用时却不需要?

Mateus Viccari:

考虑以下课程:

class Foo<T> {

    void handle(T t) {
        System.out.println("handling " + t);
    }

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);

        Foo<Integer> f = new Foo<>();

        list.forEach(f::handle);             // compiles fine
        //list.forEach(obj -> f.handle(obj));// compilation error

        f = new Foo<>(); // reassign f

    }
}

为什么我会为obj -> f.handle(obj)而不是出现编译错误f::handle

乔瓦尼·博塔(Giovanni Botta):

那些是两种不同的构造,它们在做两种不同的事情。在第一种情况下,您将获得特定对象的方法引用:只需执行一次,此后JVM便拥有对对象的自己的引用(实际上是最终的引用),f并且可以调用该handle方法。在第二种情况下,在每次调用时,JVM必须解析f引用,因此它抱怨f必须是final你可以很容易地编写代码集f,以null同时forEach运行,从而导致一个NPE。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档