【Java异常】Variable used in lambda expression should be final or effectively final
【Java异常】Variable used in lambda expression should be final or effectively final
从字面上来理解这句话,意思是:*lambda表达式中使用的变量应该是final或者有效的final*,也就是说,lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
要求外部变量为final是在编译期以强制手段确保用户不会在lambda表达式中做修改原变量值的操作。
其实在Java8之前,匿名类中如果要访问局部变量的话,那个局部变量必须显式的声明为final。
Demo代码示例:
package com.example.core.mydemo.java8; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class Java8FinalTest {
public static void main(String[] args) {
//如果直接定义变量,不会报错”Variable used in lambda expression should be final or effectively final“
// List<Integer> number = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //如果分开赋值,就会报错”Variable used in lambda expression should be final or effectively final“
List<Integer> number = null;
number = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //创建临时中间变量,可以用final也可以不用final
final List<Integer> numberTmp = number;
//Variable used in lambda expression should be final or effectively final
List<Integer> group = Arrays.asList(1,2);
List<Object> groupResult = group.stream().map(x -> calc(numberTmp)).collect(Collectors.toList());
groupResult.stream().forEach(System.out :: println); //匿名内部类 1.8不会报错
//1.7会报错:Variable 'jdkVersion' is accessed from within inner class, needs to be declared final,意思是:变量‘dkVersion’在匿名内部类中被访问,必须被声明为final类型的。
String jdkVersion = "1.7";
testFinal(new Suppliers(){
@Override
public String get() {
return jdkVersion;
}
});
} public static void testFinal(Suppliers supplier){
System.out.println("supplier=" + supplier.get());
} private static Object calc(List<Integer> number) {
//变量不允许修改
// number.add(11); Exception in thread "main" java.lang.UnsupportedOperationException
return number.stream().mapToInt(x -> x).sum();
} static class Suppliers{
public String get(){
return "hello world";
}
}
}
【Java异常】Variable used in lambda expression should be final or effectively final的更多相关文章
- Variable used in lambda expression should be final or effectively final
Lambda与匿名内部类在访问外部变量时,都不允许有修改变量的倾向,即若: final double a = 3.141592; double b = 3.141592; DoubleUnaryOpe ...
- Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
其实原因很简单,就是翻译的结果 匿名内部类和局部内部类只能引用外部的fianl变量 把变量变成fianl就行了 第一次知道啊 记小本本.......
- Java Lambda expression
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...
- Java 常用的几个lambda表达式
Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift,C#等都已经支 ...
- 浅析Java 8新特性Lambda Expression
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
- JDK 8 - Lambda Expression 的优点与限制
我们知道 JDK 8 新增了 Lambda Expression 这一特性. JDK 8 为什么要新增这个特性呢? 这个特性给 JDK 8 带来了什么好处? 它可以做什么?不可以做什么? 在这篇文章, ...
- [Java] 设计模式:代码形状 - lambda表达式的一个应用
[Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Lambda Expression
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口.下面这个例子就是使用Lambda语法来代替匿名的内部类 ...
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...
随机推荐
- 基于 Flink SQL 构建流批一体的 ETL 数据集成
简介: 如何利用 Flink SQL 构建流批一体的 ETL 数据集成. 本文整理自云邪.雪尽在 Flink Forward Asia 2020 的分享,该分享以 4 个章节来详细介绍如何利用 Fli ...
- 基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性.本文介绍了基于 EMR O ...
- ChaosBlade:从混沌工程实验工具到混沌工程平台
简介: ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已加入到 CNCF Sandbox 中.起初包含面向多环境.多语言的混沌工程实验工具 chaosblade,到现在发展到面向 ...
- [FAQ] curl SSL_connect: SSL_ERROR_SYSCALL / wget Unable to establish SSL connection
当客户端访问 https 网站时遇到这些错误提示,通常问题出在服务器,而不是客户端. 因为你换一个 https 网站进行请求,可以验证这一点. 通过浏览器访问正常,大多数浏览器通过重试较低的 TLS ...
- 鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)
前言 键鼠事件是指在计算机操作中,用户通过键盘和鼠标来与计算机进行交互的行为.常见的键鼠事件包括按下键盘上的键.移动鼠标.点击鼠标左键或右键等等.键鼠事件可以触发许多不同的操作,比如在文本编辑器中输入 ...
- XYCTF pwn部分题解 (部分题目详解)
hello_world(签到) 思路: 这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shell wp: invisible_flag 思 ...
- 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!
目录 一.爬取目标 二.分析网页 三.爬虫代码 四.同步视频 五.get完整源码 一.爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例. 爬取网站:雪球网的沪深股市行情数据 具体菜单:雪 ...
- Winform项目中纯代码创建WCF服务
接口: [ServiceContract(CallbackContract = typeof(IViewCallback), SessionMode = SessionMode.Required)] ...
- git checkout 命令图文详解
目录 git checkout branchname (切换本地分支) 切换远程分支 放弃修改 git checkout . git checkout – filename git checkout ...
- ibus 输入法导致输入卡顿的解决方案
系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...