跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 被 jvm 编译器蠢哭了
未分類
25 5 月 2020

被 jvm 编译器蠢哭了

被 jvm 编译器蠢哭了

資深大佬 : yukiloh 0

    private void myTest(boolean isNeeded) {         //业务需求:遍历一个 list 的过程中,如果 isNeeded 为 true,则为 neededList 插入数据         // ↓为编译器错误,         // ArrayList<Integer> neededList = null;         // if (isNeeded) neededList = new ArrayList<>();            // ↓通过检查         ArrayList<Integer> neededList = new ArrayList<>();           ArrayList<String> list = new ArrayList<>();         //...处理其他业务         list.forEach(element -> {             //...处理其他业务             if (isNeeded) neededList.add(1);         });     } 

为啥他就感知不到 false 的情况不会执行呢…

大佬有話說 (14)

  • 資深大佬 : wwqgtxx

    java 中 lamdba 表达式捕获的变量需要隐式的为 final 类型的吧

  • 資深大佬 : fewok

    list 插条数据呗,你这例子,list 是空数组,怎么可能会执行 foreach 里的内容呢?

  • 資深大佬 : w292614191

    哈哈哈哈哈哈哈哈,是你故意这样写的,还是我太菜了。

  • 資深大佬 : chendy

    Variable used in lambda expression should be final or effectively final

  • 資深大佬 : Aresxue

    lambda 里面的变量需要是 final 的, 使用的变量被隐式转为了 final, 编译器报错不是因为不会推断,而是你在给一个 final 变量重新赋值,手动加上 final 你就会知道真正的报错是在 neededList = new ArrayList<>(); 这里

  • 資深大佬 : Liyiw

    不是太懂这个描述。。

  • 資深大佬 : Liyiw

    @Aresxue 说的给一个 final 变量重新赋值是在哪里

  • 主 資深大佬 : yukiloh

    @Aresxue 明白了,原来会隐式添加 final.我想省那么点内存,判断需要了再去 new…

  • 資深大佬 : yousabuk

    jvm 编译器被谁蠢哭了呢

  • 資深大佬 : EscYezi

    @Liyiw needList 初始值是 null,接着 if 里面又给 needList 赋值了新的对象;像#5 所说的,needList 被编译器增加了 final,这样做是在给 final 变量重新赋值

  • 資深大佬 : Liyiw

    @EscYezi 谢谢,搞懂了

  • 資深大佬 : webbon

    @yousabuk #1 和#5 会解释这是隐式 final,而不是嘲讽别人这都不懂

  • 資深大佬 : HeapOverflow

    是 JVM 被你蠢哭了

  • 資深大佬 : Kaiv2

    明白你的意思了,个人理解: lamdba 表达式可以存在变量里,使用外部可变引用可能会增加复杂性。这里的例子如果在 forEach 中将 neededList 指向新的对象了,外部变量是否也修改呢?
    如果只是使用 forEach 遍历建议修改为 for 迭代器模式,可以解决这个问题。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具