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

前端之家收集整理的这篇文章主要介绍了为什么在Java 8中的lambda表达式需要使用其中的变量来使用“final”修饰符,而不是在使用方法引用时使用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑下列课程:
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?

解决方法

这两种不同的结构正在做两件不同的事情.在第一种情况下,您将获得特定对象的方法引用:这只需要执行一次,之后JVM有自己的引用(如此有效地最终)到对象f并可以调用handle方法.在第二种情况下,在每次调用时,JVM都必须解析f引用,因此,它会抱怨f必须是final.您可以轻松地编写将f设置为null的代码,同时forEach正在运行,从而导致NPE.

猜你在找的Java相关文章