【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的更多相关文章

  1. Variable used in lambda expression should be final or effectively final

    Lambda与匿名内部类在访问外部变量时,都不允许有修改变量的倾向,即若: final double a = 3.141592; double b = 3.141592; DoubleUnaryOpe ...

  2. Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final

    其实原因很简单,就是翻译的结果 匿名内部类和局部内部类只能引用外部的fianl变量 把变量变成fianl就行了  第一次知道啊    记小本本.......

  3. Java Lambda expression

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...

  4. Java 常用的几个lambda表达式

    Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift,C#等都已经支 ...

  5. 浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  6. JDK 8 - Lambda Expression 的优点与限制

    我们知道 JDK 8 新增了 Lambda Expression 这一特性. JDK 8 为什么要新增这个特性呢? 这个特性给 JDK 8 带来了什么好处? 它可以做什么?不可以做什么? 在这篇文章, ...

  7. [Java] 设计模式:代码形状 - lambda表达式的一个应用

    [Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...

  8. Effective Java 第三版——42.lambda表达式优于匿名类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Lambda Expression

    Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口.下面这个例子就是使用Lambda语法来代替匿名的内部类 ...

  10. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

随机推荐

  1. 基于 Flink SQL 构建流批一体的 ETL 数据集成

    简介: 如何利用 Flink SQL 构建流批一体的 ETL 数据集成. 本文整理自云邪.雪尽在 Flink Forward Asia 2020 的分享,该分享以 4 个章节来详细介绍如何利用 Fli ...

  2. 基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现

    ​简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性.本文介绍了基于 EMR O ...

  3. ChaosBlade:从混沌工程实验工具到混沌工程平台

    ​简介: ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已加入到 CNCF Sandbox 中.起初包含面向多环境.多语言的混沌工程实验工具 chaosblade,到现在发展到面向 ...

  4. [FAQ] curl SSL_connect: SSL_ERROR_SYSCALL / wget Unable to establish SSL connection

    当客户端访问 https 网站时遇到这些错误提示,通常问题出在服务器,而不是客户端. 因为你换一个 https 网站进行请求,可以验证这一点. 通过浏览器访问正常,大多数浏览器通过重试较低的 TLS ...

  5. 鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)

    前言 键鼠事件是指在计算机操作中,用户通过键盘和鼠标来与计算机进行交互的行为.常见的键鼠事件包括按下键盘上的键.移动鼠标.点击鼠标左键或右键等等.键鼠事件可以触发许多不同的操作,比如在文本编辑器中输入 ...

  6. XYCTF pwn部分题解 (部分题目详解)

    hello_world(签到) 思路: 这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shell wp: invisible_flag 思 ...

  7. 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!

    目录 一.爬取目标 二.分析网页 三.爬虫代码 四.同步视频 五.get完整源码 一.爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例. 爬取网站:雪球网的沪深股市行情数据 具体菜单:雪 ...

  8. Winform项目中纯代码创建WCF服务

    接口: [ServiceContract(CallbackContract = typeof(IViewCallback), SessionMode = SessionMode.Required)] ...

  9. git checkout 命令图文详解

    目录 git checkout branchname (切换本地分支) 切换远程分支 放弃修改 git checkout . git checkout – filename git checkout ...

  10. ibus 输入法导致输入卡顿的解决方案

    系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...