J&C:Lambda表达式

更多
2022年05月05日 09点05分 作者:叶飞 修改

复习:面向函数:函数做变量 / 回调 / 委托 / Lamda / 箭头函数……


lambda的类型

JavaScript可以将箭头函数赋值给任意一个变量,Java/C#呢?

  • Java:利用(只定义了一个方法的)接口
  • C#:利用委托

作用都是一样的:“固化”函数/方法的参数和返回。换言之,具有相同参数和返回值的方法就是同一类型的lamda。

基于上述设定,如果再引入泛型,lamda的类型其实就是由:

  • 有无返回值
  • 参数个数

决定。所以,Java和C#都内置了一些lamda类型:

  • C#:Func和Action
  • Java:Supplier/Consumer/Predicate/Func


作用域/闭包

根据变量的作用域规则,lambda表达式中可以使用其外部的变量
boolean quicken = true;
IMove m = (s, t) -> {
	if (quicken) {  //OK
		s *= 2;
	}			
	return s * t;
};		
System.out.println(s); //error

那么,如果:

  • 一个方法返回的是一个lambda表达式
  • 而且这个lambda表达式使用了(在方法体中的)外部变量
static IMove goSchool() {
	boolean quicken = true;
	return (s, t) -> {
		//以下代码会在何时执行?
		if (quicken) {  //OK
			s *= 2;
		}			
		return s * t;
	};	
}

这就会形成(狭义上的)闭包,即:lambda表达式延长了quicken的生命周期。

  • 如果goSchool()中没有lambda表达式,如果lamda表达式中没有使用quicken:quicken应该在goSchool()被调用结束后被销毁(出栈)
  • 但goSchool()执行完成返回的是一个(尚未执行的)函数,该函数直到再次被调用才开始真正执行
  • 所以quicken应该被保留,不能被销毁

断点演示:


作业

分别利用Java/C#语法:

  1. 使用double做数据类型,分别用自定义的/内置的lambda,完成面向函数:Lamda中1-3题
  2. 改造Content的Publish()方法
    1. 能够接收lambda做参数
    2. 方法体内能利用传入的lambda输出Content的标题和内容
  3. 改造User的Login()方法,接收
    1. 一个success参数,确定:登录成功之后如何处理
    2. 一个failed参数,确定:登录失败如何处理
lambda 闭包
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


其他:WebForm和WebApi

其他ASP.NET框架,如WebForm、WebApi……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

分层架构和综合实战

J&C

Java和C#共有的语法

全部
关键字



帮助

反馈