【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. [Go] godoc 打开本地文档, windows 同样适用

    godoc 提供了在无网环境下 浏览官方文档的便利. 示例: $ go get golang.org/x/tools/cmd/godoc $ godoc -http=localhost:6060 Li ...

  2. 一键启动的AI离线知识库,无需复杂环境依赖,小白都能上手了

    简介 在人工智能技术飞速发展的今天,我们经常面临一个挑战:如何快速.简便地部署和使用AI技术?AntSK项目,一个开源的AI知识库和智能体,就是为了解决这一问题而诞生的.现在,我们自豪地宣布,AntS ...

  3. 一个可一键生成短视频的AI大模型,亲测可用

    大家好,我是 Java陈序员. 自从 OpenAI 发布 Sora 文本生成视频模型后,文本生成视频的 AI 技术引起了无数圈内圈外人士的关注和实验. 今天,给大家介绍一个大模型,可一键生成短视频. ...

  4. 深入了解 Java 字节码

    1.1 什么是字节码? Java 在刚刚诞生之时曾经提出过一个非常著名的口号: "一次编写,到处运行(write once,run anywhere)",这句话充分表达了软件开发人 ...

  5. 【GUI软件】抖音搜索结果批量采集,支持多个关键词、排序方式、发布时间筛选等!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  6. 【爬虫数据集】滇西小哥YouTube频道TOP10热门视频的热评数据,共2W条!

    目录 一.背景介绍 二.爬取目标 三.结果展示 四.演示视频 五.附完整数据 一.背景介绍 滇西小哥是一位来自中国云南省的视频博主,他在YouTube上拥有超过1000万的订阅者和上亿的观看量.他的视 ...

  7. PostgreSQL数据库管理工具pgAdmin4界面如何设置为中文显示

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485130&idx=1 ...

  8. Flutter 多线程实现

    异步Isolate实现多线程   最近在看Flutter开发相关知识点,对照着Android原生,探究了下多线程实现方式.在Flutter中有 Isolate,隔离,它的实现原理并不是内存共享的,它更 ...

  9. 2020年9月至10月 Splashtop 新功能

    ​ Splashtop 已为 Splashtop Business Access.Splashtop Remote Support.Splashtop SOS 和 Splashtop On-Prem ...

  10. 面向K-12学生的远程访问学校计算机实验室

    ​ 为了应对新冠肺炎大流行,许多学校被迫采用远程学习和混合时间制度.在家学习的学生必须使用自己的个人设备或学校提供的设备(例如 Chromebook )来完成课堂作业. 尽管许多解决方案可以帮助学生和 ...