为什么在Java 8中的lambda表达式需要使用其中的变量来使用“fina
发布时间:2020-12-14 05:34:05 所属栏目:Java 来源:网络整理
导读:考虑下列课程: class FooT { void handle(T t) { System.out.println("handling " + t); } public static void main(String[] args) { ListInteger list = new ArrayList(); list.add(1); list.add(2); FooInteger f = new Foo(); list.forEach(f::handle);
考虑下列课程:
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.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |