加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读