Error:(343, 83) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

    /**
     * 问题代码(只是为了重现错误,请忽略代码逻辑)
     */ 
    @Test
    public void test23(){
        ArrayList<Book> list = new ArrayList<>();
        list.add(new Book("魔法书","20"));
        list.add(new Book("武术书","30"));
        list.add(new Book("技能书","50"));
        list.add(new Book("魔法书","20"));
        List<Book> list2 = list;
        String orgShortName;
        List<Book> collect = null;
        for (Book vo : list) {
            if (null != vo){
                orgShortName = "";
                if (!StringUtils.isEmpty(orgShortName)){
                    // Error:(343, 83) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
                    // 即lambda表达式中使用的本地变量 必须是被final变量或是实际只被赋值过一次的变量
                     collect = list2.stream().filter(temp -> temp.getName().equals(orgShortName)).collect(Collectors.toList());
                }
            }
        }
        System.out.println(collect);
    }

问题代码↑:

解决思路↓:

    /**
     * ERROR:"从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量"
     *      即编译器要求:lambda表达式中使用的局部变量(如此处的orgShortName) 必须是被final变量或是实际只被赋值过一次的变量
     * 问题分析:
     *      通常为了节省开销,习惯将遍历中用到的变量声明到外边,这时编译器会认为该变量有被重复赋值的风险,故抛出异常。
     * 解决方法:
     *      考虑将变量声明到遍历内,骗过编译器的判断(使用该方法会使得每次遍历都声明同名变量,稍微加大了资源开销)
     */
    @Test
    public void test23(){
        ArrayList<Book> list = new ArrayList<>();
        list.add(new Book("魔法书","20"));
        list.add(new Book("武术书","30"));
        list.add(new Book("技能书","50"));
        list.add(new Book("魔法书","20"));
        List<Book> list2 = list;
        //String orgShortName;
        List<Book> collect = null;
        for (Book vo : list) {
            if (null != vo){
                String orgShortName = vo.getName();
                if (!StringUtils.isEmpty(orgShortName)){
                    // Error:(343, 83) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
                    // 即lambda表达式中使用的本地变量 必须是被final变量或是实际只被赋值过一次的变量
                    collect = list2.stream().filter(temp -> temp.getName().equals(orgShortName)).collect(Collectors.toList());
                }
            }
        }
        System.out.println(collect);
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第Ⅰ部分 C#语言 第1章 C#简介 3 1.1 .net framework的含义 3 1.1.1 .net framework的内容 4 1.1.2 使用.net framework编写应用程序 4 1.2 C#的含义 7 1.2.1 用C#能编写什么样的应用程序 7 1.2.2 本书中的C# 8 1.3 visual studio 2010 8 1.3.1 visual studio 2010 express产品 9 1.3.2 解决方案 9 1.4 小结 9 1.5 本章要点 10 第2章 编写C#程序 11 2.1 开发环境 12 2.1.1 visual studio 2010 12 2.1.2 visual C# 2010 express edition 14 2.2 控制台应用程序 15 2.2.1 solution explorer 19 2.2.2 properties窗口 20 2.2.3 error list窗口 20 2.3 windows forms应用程序 21 2.4 小结 25 2.5 本章要点 25 第3章 变量表达式 27 3.1 C#的基本语法 27 3.2 C#控制台应用程序的基本结构 30 3.3 变量 31 3.3.1 简单类型 31 3.3.2 变量的命名 35 3.3.3 字面值 36 3.3.4 变量的声明和赋值 38 3.4 表达式 39 3.4.1 数学运算符 39 3.4.2 赋值运算符 43 3.4.3 运算符的优先级 44 3.4.4 名称空间 45 3.5 小结 47 3.6 练习 48 3.7 本章要点 49 第4章 流程控制 51 4.1 布尔逻辑 51 4.1.1 布尔赋值运算符 54 4.1.2 按位运算符 55 4.1.3 运算符优先级的更新 59 4.2 goto语句 60 4.3 分支 61 4.3.1 三元运算符 61 4.3.2 if语句 61 4.3.3 switCh语句 65 4.4 循环 68 4.4.1 do循环 68 4.4.2 while循环 71 4.4.3 for循环 73 4.4.4 循环的中断 77 4.4.5 无限循环 78 4.5 小结 78 4.6 练习 79 4.7 本章要点 79 第5章 变量的更多内容 81 5.1 类型转换 81 5.1.1 隐式转换 82 5.1.2 显式转换 83 5.1.3 使用Convert命令进行显式转换 86 5.2 复杂的变量类型 89 5.2.1 枚举 89 5.2.2 结构 93 5.2.3 数组 96 5.3 字符串的处理 102 5.4 小结 106 5.5 练习 107 5.6 本章要点 108 第6章 函数 109 6.1 定义和使用函数 110 6.1.1 返回值 111 6.1.2 参数 113 6.2 变量的作用域 120 6.2.1 其他结构中变量的作用域 122 6.2.2 参数和返回值与全局数据 124 6.3 main( )函数 125 6.4 结构函数 128 6.5 函数的重载 128 6.6 委托 130 6.7 小结 133 6.8 练习 133 6.9 本章要点 134 第7章 调试和错误处理 135 7.1 vs和vce中的调试 135 7.1.1 非中断(正常)模式下的调试 136 7.1.2 中断模式下的调试 144 7.2 错误处理 152 7.2.1 try...catch...finally 153 7.2.2 列出和配置异常 157 7.2.3 异常处理的注意事项 158 7.3 小结 159 7.4 练习 159 7.5 本章要点 159 第8章 面向对象编程简介 161 8.1 面向对象编程的含义 162 8.1.1 对象的含义 162 8.1.2 一切皆对象 165 8.1.3 对象的生命周期 165 8.1.4 静态和实例类成员 166 8.2 oop技术 167 8.2.1 接口 167 8.2.2 继承 169 8.2.3 多态性 171 8.2.4 对象之间的关系 172 8.2.5 运算符重载 173 8.2.6 事件 174 8.2.7 引用类型和值类型 174 8.3 windows应用程序中的oop 175 8.4 小结 177 8.5 练习 177 8.6 本章要点 178 第9章 定义类 179 9.1 C#中的类定义 179 9.2 system.objeCt 184 9.3 构造函数和析构函数 185 9.4 vs和vCe中的oop工具 190 9.4.1 Class view窗口 190 9.4.2 对象浏览器 192 9.4.3 添加类 193 9.4.4 类图 194 9.5 类库项目 196 9.6 接口和抽象类 199 9.7 结构类型 201 9.8 浅度和深度复制 203 9.9 小结 203 9.10 练习 204 9.11 本章要点 204 第10章 定义类成员 205 10.1 成员定义 205 10.1.1 定义字段 206 10.1.2 定义方法 206 10.1.3 定义属性 207 10.1.4 在类图中添加成员 212 10.1.5 重构成员 215 10.1.6 自动属性 216 10.2 类成员的其他议题 217 10.2.1 隐藏基类方法 217 10.2.2 调用重写或隐藏的基类方法 219 10.2.3 嵌套的类型定义 220 10.3 接口的实现 220 10.4 部分类定义 224 10.5 部分方法定义 225 10.6 示例应用程序 227 10.6.1 规划应用程序 227 10.6.2 编写类库 228 10.6.3 类库的客户应用程序 235 10.7 call hierarchy窗口 236 10.8 小结 237 10.9 练习 237 10.10 本章要点 238 第11章 集合、比较和转换 239 11.1 集合 239 11.1.1 使用集合 240 11.1.2 定义集合 246 11.1.3 索引符 247 11.1.4 给Cardlib添加Cards集合 250 11.1.5 关键字值集合和idiCtionary 252 11.1.6 迭代器 254 11.1.7 深复制 259 11.1.8 给Cardlib添加深复制 261 11.2 比较 263 11.2.1 类型比较 263 11.2.2 值比较 268 11.3 转换 283 11.3.1 重载转换运算符 284 11.3.2 as运算符 285 11.4 小结 286 11.5 练习 286 11.6 本章要点 287 第12章 泛型 289 12.1 泛型的概念 289 12.2 使用泛型 291 12.2.1 可空类型 291 12.2.2 system.ColleCtions.generiC名称空间 297 12.3 定义泛型类型 307 12.3.1 定义泛型类 308 12.3.2 定义泛型接口 319 12.3.3 定义泛型方法 319 12.3.4 定义泛型委托 321 12.4 变体 321 12.4.1 协变 322 12.4.2 抗变 323 12.5 小结 324 12.6 练习 324 12.7 本章要点 325 第13章 其他oop技术 327 13.1 ::运算符和全局名称空间限定符 327 13.2 定制异常 329 13.3 事件 331 13.3.1 事件的含义 331 13.3.2 处理事件 332 13.3.3 定义事件 334 13.4 扩展和使用Cardlib 343 13.5 小结 351 13.6 练习 352 13.7 本章要点 352 第14章 C#语言的改进 353 14.1 初始化器 353 14.1.1 对象初始化器 354 14.1.2 集合初始化器 356 14.2 类型推理 359 14.3 匿名类型 360 14.4 动态查找 364 14.4.1 dynamiC类型 365 14.4.2 idynamiCmetaobjeCtprovider 369 14.5 高级方法参数 369 14.5.1 可选参数 369 14.5.2 命名参数 371 14.5.3 命名参数和可选参数的规则 375 14.6 扩展方法 375 14.7 lambda表达式 379 14.7.1 复习匿名方法 379 14.7.2 把lambda表达式用于匿名方法 380 14.7.3 lambda表达式的参数 383 14.7.4 lambda表达式的语句体 384 14.7.5 lambda表达式用作委托和表达式树 385 14.7.6 lambda表达式和集合 386 14.8 小结 388 14.9 练习 389 14.10 本章要点 390 第Ⅱ部分 windows 编 程 第15章 windows编程基础 393 15.1 控件 393 15.1.1 属性 394 15.1.2 控件的定位、停靠和对齐 395 15.1.3 anchor和dock属性 395 15.1.4 事件 396 15.2 button控件 398 15.2.1 button控件的属性 398 15.2.2 button控件的事件 398 15.2.3 添加事件处理程序 399 15.3 label和linklabel控件 400 15.4 textbox控件 401 15.4.1 textbox控件的属性 401 15.4.2 textbox控件的事件 402 15.4.3 添加事件处理程序 404 15.5 radiobutton和CheCkbox控件 407 15.5.1 radiobutton控件的属性 408 15.5.2 radiobutton控件的事件 408 15.5.3 CheCkbox控件的属性 408 15.5.4 CheCkbox控件的事件 409 15.5.5 groupbox控件 409 15.6 riChtextbox控件 412 15.6.1 riChtextbox控件的属性 412 15.6.2 riChtextbox控件的事件 413 15.7 listbox和CheCkedlistbox控件 418 15.7.1 listbox控件的属性 418 15.7.2 listbox控件的方法 419 15.7.3 listbox控件的事件 420 15.8 listview控件 422 15.8.1 listview控件的属性 422 15.8.2 listview控件的方法 424 15.8.3 listview控件的事件 424 15.8.4 listviewitem 425 15.8.5 Columnheader 425 15.8.6 imagelist控件 425 15.9 tabControl控件 431 15.9.1 tabControl控件的属性 432 15.9.2 使用tabControl控件 432 15.10 小结 434 15.11 练习 434 15.12 本章要点 434 第16章 windows窗体的高级功能 435 第17章 部署windows应用程序 465 第Ⅲ部分 web 编 程 第18章 asp-net web编程 503 第19章 web服务 557 第20章 部署web应用程序 581 第Ⅳ部分 数 据 访 问 第21章 文件系统数据 597 第22章 xml 633 第23章 linq简介 657 第24章 应用linq 695 第Ⅴ部分 其 他 技 术 第25章 windows presentation 第26章 windows Communication Foundation 787 第27章 windows workflow foundation 819 附录A 习题答案 839
Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,有什么特殊之处? Java虛拟机调用字节码指令有哪些? 虚拟机是如何执行方法里面的字节码指令的? 解释执行 基于栈的指令集和基于寄存器的指令集 什么是基于栈的指令集? 什么是基于寄存器的指令集? 基于栈的指令集的优缺点? Javac编译过程分为哪些步骤? 什么是即时编译器? 解释器和编译器 为什么要采用分层编译? 分层编译器有哪些层次? 编译对象与触发条件 热点代码有哪些? 如何判断一段代码是不是热点代码? Hotspot虚拟机使用第二种,有两个计数器: 方法调用计数器统计方法 有哪些经典的优化技术(即时编译器)? 公共子表达式消除 数组边界检查消除 方法内联 逃逸分析 如果对象不会逃逸到方法或线程外,可以做什么优化? Java与C/C++的编译器对比 物理机如何处理并发问题? Java内存模型 什么是Java内存模型? Java内存模型的目标? 主内存与工作内存 内存间的交互操作 原子性、可见性、有序性 volatile 什么是 volatile? 为什么基于 volatile变量的运算在并发下不一定是安全的? 为什么使用 volatile? 并发与线程 并发与线程的关系? 什么是线程? 实现线程有哪些方式? Java线程的实现 Java线程调度 什么是线程调度? 线程调度有哪些方法? 线程安全的定义? Java语言操作的共享数据,包括哪些? 不可变 如何实现线程安全? 阻塞同步(互斥同步) 非阻塞同步 锁优化是在DK的那个版本? 为什么要提出自旋锁? 自旋锁的原理? 自旋的缺点? 什么是自适应自旋? 锁消除 锁粗化 轻量级锁 偏向锁 JDK是什么? JDK是用于支持Java程序开发的最小环境。 1.Java程序设计语言 2.Java虚拟机 3. Java ap类库 JRE是什么? JRE是支持Java程序运行的标准环境。 1. Java SE aPi子集 2.Java虚拟机 Java历史版本的特性? Java∨ ersion se5.0 引入泛型; 增强循环,可以使用迭代方式; 自动装箱与自动拆箱; 类型安全的枚举 ·可变参数; 静态引入 元数据(注解); 引入 Instrumentation Java∨ ersion se6 支持脚本语言 引入JDBC40API; 引入 Java Compiler API; 可插拔注解; 增加对 Native PKi( Public Key Infrastructure)、 Java gss( Generic Security Service) Kerberos和 LDAP(Lightweight Directory Access Protocol的支持; 继承 Web services 做了很多优化。 Java∨ ersion se7 switch语句块中允许以字符串作为分支条件; 在创建泛型对象时应用类型推断 ·在一个语句块中捕获多种异常; ·支持动态语言; 支持try-with- resources 引入 Java nio.2开发包; ·数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线; 钻石型语法; nu值的自动处理。 Java 8 函数式接口 Lambda表达式 接口的增强 运行时数据区域包括哪些? 1.程序计数器 2.Java虚拟机栈 3.本地方法栈 4.Java堆 5.方法区 6.运行时常量池 7.直接内存 程序计数器(线程私有) 程序计数器( Program Counter Register)是一块较小的内存空间,可以看作是当前线程所 执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这 个计数器完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线 程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间的计 数器互不影响,独立存储。 1.如果线程正在执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地 址 2.如果正在执行的是 Native方法,这个计数器的值为空 程序计数器是唯一—个没有规定任何 OutofMemoryError的区域 Java虚拟机栈(线程私有) Java虚拟机栈( Java virtual machine stacks)是线程私有的,生命周期与线程相同。 虛拟机栈描述的是Ja阳a方法执行的内存模型:每个方法被执行的时候都会创建一个栈 帧( Stack frame),存储 1.局部变量表 2.操作栈 3.动态链接 4.方法出口 每—一个方法被调用到执行完成的过程,就对应着一个栈帧在虛拟机栈中从入栈到出栈的过程。 这个区域有两种异常情况: 1. StackOverflow error:线程请求的栈深度大于虚拟机所允许的深度 2. OutOfMemoryError:虚拟机栈扩展到无法申请足够的内存时 本地方法栈(线程私有 虚拟机栈为虚拟机执行Java方法(字节码)服务。 本地方法栈( Native method stacks)为虚拟机使用到的 Native方法服务。 Java堆(线程共享) Java堆( Java Heap)是Java虚拟机中内存最大的一块。Java堆在虚拟机启动时创建,被所 有线程共享。 作用:存放对象实例。垃圾收集器主要管理的就是Java堆。Java堆在物理上可以不连续,只 要逻辑上连续即可。 方法区(线程共亨) 方法区( Method area)被所有线程共享,用于存储已被虛拟机加载的类信息、常量、静态 变量、即时编译器编译后的代码等数据。 和Java堆一样,不需要连续的内存,可以选择固定的大小,更可以选择不实现垃圾收集。 运行时常量池 运行时常量池( Runtime Constant pool)是方法区的一部分。保存 Class文件中的符号引 用、翻译岀来的直接引用。运行时常量池可以在运行期间将新的常量放入池中 Java中对象访问是如何进行的? Object ob j new Object( 对于上述最简单的访问,也会涉及到Java栈、Java堆、方法区这三个最重要内存区域。 Object obj 如果出现在方法体中,则上述代码会反映到Java栈的本地变量表中,作为 reference类型数 据出现。 new Object( 反映到Java堆中,形成一块存储了 bject类型所有对象实例数据值的内存。Java堆中还包 含对象类型数据的地址信息,这些类型数据存储在方法区中, 如何判断对象是否“死去”? 1.引用计数法 2.根搜索算法 什么是引用计数法? 给对象添加一个引用计数器,每当有一个地方引用它,计数器就+1,;当引用失效时,计数器 就-1;任何时刻计数器都为0的对象就是不能再被使用的 引用计数法的缺点? 很难解决对象之间的循环引用问题。 什么是根搜索算法? 通过一系列的名为" GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过 的路径称为引用链( Reference chain),当一个对象到 GC Roots没有任何引用链相连(用 图论的话来说就是从 GC Roots到这个对象不可达)时,则证明此对象是不可用的。 object 5 object 6 object 7 仍然存活的对象 □判定可回收的对象 Java的4种引用方式? 在」DK1.2之后,Java引用的概念进行了扩充,将引用分为 1.强引用 Strong reference 2.软引用 Soft reference 3.弱引用 Weak Reference 4.虚引用 Phantom reference 强引用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值