当前位置: 首页 > wzjs >正文

网站商城前台模板免费下载佛山做优化的公司

网站商城前台模板免费下载,佛山做优化的公司,体验做黑客的网站,wordpress主题中文字体插件闭包(Closure)是函数式编程中的一个重要概念,在Java 8中通过Lambda表达式和函数式接口得到了支持。虽然Java官方文档中并不直接使用"闭包"这一术语,但Lambda表达式的行为本质上实现了闭包的功能。 什么是闭包 闭包是指一…

闭包(Closure)是函数式编程中的一个重要概念,在Java 8中通过Lambda表达式和函数式接口得到了支持。虽然Java官方文档中并不直接使用"闭包"这一术语,但Lambda表达式的行为本质上实现了闭包的功能。

什么是闭包

闭包是指一个函数(或方法)能够访问并记住其词法作用域(lexical scope)中的变量,即使该函数在其原始作用域之外执行。

Java中的闭包通过Lambda表达式和匿名内部类实现,具有以下特点:

  • 可以捕获外部作用域的变量
  • 保持这些变量的生命周期
  • 即使外部方法执行完毕,闭包仍可访问这些变量

Java中的闭包实现

Lambda表达式作为闭包

public class ClosureDemo {public static void main(String[] args) {int a = 10;// Lambda表达式捕获了外部变量aFunction<Integer, Integer> closure = i -> a + i;System.out.println(closure.apply(20)); // 输出30// 即使a超出作用域,闭包仍可访问它们// 因为闭包"记住"了这些变量System.out.println(f(closure)); // 输出110}public static int f(Function<Integer, Integer> closure){// 这里虽然只有100,但是仍然能访问到a这个参数return closure.apply(100);}
}

匿名内部类作为闭包

public class AnonymousClassClosure {public static void main(String[] args) {final String message = "Hello, ";Runnable runnable = new Runnable() {@Overridepublic void run() {// 访问外部final变量System.out.println(message + "World!");}};new Thread(runnable).start();}
}

Java闭包的关键特性

变量捕获规则

  • 局部变量:Lambda表达式或匿名内部类只能捕获final或等效final(effectively final)的局部变量

  • 实例变量和静态变量:可以自由访问和修改,不需要是final

闭包中的this关键字

在Lambda表达式中,this关键字指的是包含Lambda表达式的方法所在类的实例,而不是Lambda表达式本身。

public class ThisInClosure {private String name = "Outer";public void test() {String name = "Inner";Runnable r = () -> {System.out.println(this.name); // 输出"Outer"System.out.println(name);      // 输出"Inner"};new Thread(r).start();}
}

Java闭包的限制

  • 变量必须是final或等效final:Lambda表达式只能捕获不会改变的局部变量
  • 性能考虑:每次捕获变量都会创建一个新对象,可能影响性能
  • 内存泄漏风险:闭包可能意外延长对象的生命周期

Lambda表达式实现闭包的内部原理

还是以ClosureDemo为例,添加jvm参数,重新运行,打印lambda运行过程中jvm动态生成的类:

-Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles

如下:

final class ClosureDemo$$Lambda implements Function {private final int arg$1;private ClosureDemo$$Lambda(int var1) {this.arg$1 = var1;}public Object apply(Object var1) {return ClosureDemo.lambda$main$0(this.arg$1, (Integer)var1);}
}

这就看的很清楚了,lambda表达式捕获的变量会作为运行时动态生成的类的成员变量记录下来,因此当lambda表达式运行的时候就可以访问被捕获的变量了。

http://www.dtcms.com/wzjs/414683.html

相关文章:

  • 制作视频模板的软件淘宝关键词怎么优化
  • 哔哩哔哩网站电子商务建设网站制作的流程
  • 技术支持 优府网络太原网站建设百度手机怎么刷排名多少钱
  • 建设银行 杭州市公积金管理中心网站网站技术外包公司
  • 汉口做网站的公司最近三天的新闻大事
  • 嘉兴市南湖区建设局网站湖州网站建设制作
  • 自己做网站要多少钱网站查询平台
  • 咖啡网站建设it培训机构
  • 泰州哪家网做网站一个产品的宣传和推广方案
  • 企业crm系统成都优化网站哪家公司好
  • 轻淘客cms建站教程新网站快速排名软件
  • 如何导入wordpress沈阳沈河seo网站排名优化
  • 微信小程序模板网站软件排名工具
  • discuz导入wordpress长沙seo优化服务
  • 上市公司网站分析百度网址安全中心
  • 汕头建站免费模板网站搜索排名优化软件
  • 六安市网站制作百度营业执照怎么办理
  • 现在.net做网站的多吗百度一对一解答
  • 海南公司网站建设合肥网站制作推广
  • 网站建设公司主营业务网站交易平台
  • 广州市最新防疫情百度竞价推广账户优化
  • 厦门市网站建设网站制作方案
  • mysql 视频网站开发成人电脑培训班办公软件
  • 西安网站建设 中讯创赢东莞疫情最新消息今天新增
  • 淄博做网站公司有哪些竞价代运营公司哪家好
  • 四川住房建设厅网站首页广告宣传
  • 武汉品牌网站建设公司排名百度代理合作平台
  • 做寂网站最好的网站优化公司
  • 河北平台网站建设哪家有百度快照推广一年要多少钱
  • 什么网站做品牌特卖新媒体seo培训