lambda ::_Lambda项目:迈向多核及超越

lambda ::

周一下午在JavaOne 2011的希尔顿旧金山大宴会厅B上做了“ Project Lambda:迈向多核和超越”(会议27400,不要与Brian Goetz的同名演讲相混淆) 的演示 。大宴会厅关闭,这是一个非常大型的非主题演讲场地,还有一台大型摄像头(带摄像头操作员)可以拍摄演示文稿。 可以认为这意味着会议组织者对Java SE 8JSR 337 )和Lambda项目的关注引起了极大的兴趣。 演讲者Alex Buckley (Java语言和虚拟机的规范负责人)和Daniel Smith (项目Lambda规范负责人)是演示者,接下来将展示其摘要。

本课程涵盖Java SE 8的主要新语言功能-lambda表达式,方法引用和扩展方法-并探讨现有和将来的库将如何利用它们来使客户端代码同时具有更高的性能和更少的错误。 -容易。

功能接口是“一种方法的接口”。 Lambda表达式是“创建功能接口实现的一种方式”。 Lambda表达式允许简单,简洁地表达功能的“实质”,尤其是与匿名类的膨胀相比。 几张幻灯片中包含了一些代码示例,这些代码示例显示了我们今天如何做以及lambda表达式支持的更简洁的表示形式。
Lambda表达式“可以引用封闭范围内的任何有效最终变量。” 这意味着final关键字不是必需的,而是需要在lambda表达式引用的方法中将其视为final(未分配引用)。 宣布了更多的lambda表达式规则: this指针引用了封闭对象而不是lambda表达式。 “无需在lambda表达式中使用参数类型”,因为它们是“根据功能接口的方法签名来推断的”(无需动态键入)。 方法引用支持“将方法作为lambda表达式使用”的“重用”。
Buckley谈到外部迭代是Java库中当前的主要方法。 在这种习惯用法中,“客户端决定迭代”并且“不是线程安全的”。 他谈到了引入并行for循环来解决此问题的缺点,但从并行for方法中提取了一些概念:“过滤器”和“归约器”。 Buckley引入了“内部迭代有利于并行习语”的想法,因为它不需要串行执行并且是线程安全的。
Java 8面临的问题之一是需要改造库以使用lambda表达式,但是它们已经定义了在库和集合中大量使用的接口。 可以用来解决此问题的一种方法是在Java中使用静态扩展方法,类似于C#中可用的方法。 这种方法有很多优点,但也有一些主要缺点,例如无法使用反射。 决定重新考虑“不能向接口添加操作”的“规则”。 基于此,随后决定添加虚拟扩展方法 ,该方法在接口中提供默认实现,该接口仅在接收器类未使用默认实现覆盖该方法时使用。
幻灯片标题为“您是否向Java添加了多个继承?!” 指出“ Java始终具有类型的多重继承”和“现在具有行为的多重继承”,但仍不支持“状态的多重继承,这会导致大多数问题。” 幻灯片补充说,“行为的多重继承是相当良性的”,并且仅当编译分多个步骤进行时,这确实是一个问题。 在此演示文稿中强调了扩展方法是语言功能和虚拟机功能(“关于继承和调用的其他所有内容都是VM功能!”)。 为此,项目符号指出:“如果需要,调用界面将消除多种行为的歧义。” 非Java JVM语言可以“共享财富”扩展方法,其中有一张幻灯片提供了三个示例。
Daniel Smith主持了有关并行库主题的演示。 他展示了一张幻灯片“ Betain the New Iterable”,其中展示了一个Iterable接口,其中包括isEmpty()forEachfiltermapreduceinto 。 他还展示了可通过扩展方法parallel()Iterable获得的Parallelterable接口上的幻灯片。
Smith在其关于社区贡献的幻灯片中提供了对JSR 335,JSR 166和Lambda项目的引用。 他还列举了JavaOne 2011上另外四个关于lambda表达式和紧密相关主题的会议。 史密斯以Brian Laetda在Project Lambda上的一句话作为结尾: …我们相信,对Java开发人员来说,我们能做的最好的事情就是让他们轻而易举地朝着更具功能性的编程风格发展。 我们不会将Java变成Haskell,甚至不会变成Scala。 但是方向很明确。  
结论
Smith的示例清楚地表明,lambda表达式将为Java开发人员的日常工作提供巨大的好处。 他展示了我们都必须编写数百或数千次的循环类型以及lambda表达式使之更简洁,更简洁的语法。 该演示文稿已经清楚地表明,随着引入lambda表达式,Java将在流畅性和简洁性方面获得动态类型语言所享有的许多好处。

翻译自: https://www.javacodegeeks.com/2012/08/project-lambda-to-multicore-and-beyond.html

lambda ::

可以通过添加子菜单的方式实现多级菜单,以下是修改后的代码: ``` menu_bar = tk.Menu(master) # 创建“文件”菜单 file_menu = tk.Menu(menu_bar, tearoff=0) file_menu.add_command(label="5M點檢表", command=lambda: self.read_from_excel(file_menu, "5M點檢表")) file_menu.add_command(label="Router首件检查记录表", command=lambda: self.read_from_excel1(file_menu, "Router首件检查记录表")) file_menu.add_command(label="板组作业首件检查记录表", command=lambda: self.read_from_excel2(file_menu, "板组作业首件检查记录表")) # 创建“保养”菜单 maintenance_menu = tk.Menu(menu_bar, tearoff=0) maintenance_menu.add_command(label="日保養", command=lambda: self.read_from_excel3(maintenance_menu, "日保養")) maintenance_menu.add_command(label="周保養", command=lambda: self.read_from_excel4(maintenance_menu, "周保養")) # 创建“测试”菜单 test_menu = tk.Menu(menu_bar, tearoff=0) test_menu.add_command(label="人工測試站表單", command=lambda: self.read_from_excel5(test_menu, "人工測試站表單")) test_menu.add_command(label="自動化測試站表單", command=lambda: self.read_from_excel6(test_menu, "自動化測試站表單")) # 创建“PA”子菜单 pa_menu = tk.Menu(file_menu, tearoff=0) pa_menu.add_command(label="PA1", command=lambda: self.read_from_excel(pa_menu, "PA1")) pa_menu.add_command(label="PA2", command=lambda: self.read_from_excel(pa_menu, "PA2")) file_menu.add_cascade(label="PA", menu=pa_menu) # 创建“保养表单”子菜单 daily_menu = tk.Menu(maintenance_menu, tearoff=0) daily_menu.add_command(label="日常保养表单1", command=lambda: self.read_from_excel(daily_menu, "日常保养表单1")) daily_menu.add_command(label="日常保养表单2", command=lambda: self.read_from_excel(daily_menu, "日常保养表单2")) maintenance_menu.add_cascade(label="日常保养表单", menu=daily_menu) weekly_menu = tk.Menu(maintenance_menu, tearoff=0) weekly_menu.add_command(label="周保养表单1", command=lambda: self.read_from_excel(weekly_menu, "周保养表单1")) weekly_menu.add_command(label="周保养表单2", command=lambda: self.read_from_excel(weekly_menu, "周保养表单2")) maintenance_menu.add_cascade(label="周保养表单", menu=weekly_menu) # 创建“F/T表单”子菜单 manual_menu = tk.Menu(test_menu, tearoff=0) manual_menu.add_command(label="人工F/T表单1", command=lambda: self.read_from_excel(manual_menu, "人工F/T表单1")) manual_menu.add_command(label="人工F/T表单2", command=lambda: self.read_from_excel(manual_menu, "人工F/T表单2")) test_menu.add_cascade(label="人工F/T表单", menu=manual_menu) auto_menu = tk.Menu(test_menu, tearoff=0) auto_menu.add_command(label="自动化F/T表单1", command=lambda: self.read_from_excel(auto_menu, "自动化F/T表单1")) auto_menu.add_command(label="自动化F/T表单2", command=lambda: self.read_from_excel(auto_menu, "自动化F/T表单2")) test_menu.add_cascade(label="自动化F/T表单", menu=auto_menu) # 将菜单添加到菜单栏 menu_bar.add_cascade(label="文件", menu=file_menu) menu_bar.add_cascade(label="保养表单", menu=maintenance_menu) menu_bar.add_cascade(label="F/T表单", menu=test_menu) # 将菜单栏添加到主窗口 master.config(menu=menu_bar) ``` 注意:子菜单应该使用 `add_cascade` 方法添加到父菜单中,而不是使用 `add_command`。这样可以创建多级菜单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值