再谈Java

lambda表达式
lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。将一个代码块传递到某个对象。这个代码块将来在某个时间调用。在Java中想要传递代码块只能构造一个对象,所以要想实现这个特性Java引用了lambda。
lambda表达式的语法
一个方法由返回值,函数名,参数,函数代码构成。
例如:

class example implements Comparator<String>
{
	public int compare(String first,String second)
	{
		return first.lenght()-second.lenght();
	}
}

lambda表达式将参数放在括号中加一个箭头箭头后面放上代码块,
例如:

(String first,String Second)
  ->first.lenght()-second.lenght();

lambda就是一个代码块,并且加上参数类型。如果完成的代码计算无法放在一个表达中,把这些代码放在{}中。如果没有参数,仍然要提供空括号,就像参数方法一样,如果可以推导出参谋类型,可以忽略类型,如果只用一个类型并且参数类型可以推导出来,那么可以省略小括号。
函数式接口
Java中有许多封装代码块的接口,lambda表达式与这些接口兼容。对于只有一个抽象方法的接口,需要这些接口的对象时,就可以提供一个lambda表达式,这种接口成为函数式接口。函数式接口比内联类相比要高效,lambda可以转化为接口。实际上在Java中也就只能转为接口。不能把lambda赋值给一个Object变量,Object不是一个函数式接口。
方法引用
有时已经有现有的方法可以传递到其他代码的某个动作。
例如:

Timer t=new Timer(1000,event->System.out.printLn(event));
可以直接将方法写入这个构造器
Timer t=new Timer(1000,System.out::println);

表达式是一个方法引用,他等价于lambda表达式,要用“::”分隔方法名与类名或对象,主要有三种情况:
object::instanceMethod
Class::staticMethod
Class::instanceMethod
对于前两种情况方法引用等价于提供方法参数的lambda表达式。对于第三种情况,第一个参数可以成为方法的目标。
可以在方法引用中使用this参数,super也是合法的
构造器的引用
构造器引用与方法引用很类似,只不过方法名为new。例如Person::new是Person构造器的引用。具体哪一个构造器取决于上下文的引用。可以用数组类型建立构造器引用,例如:int[]::new,他有一个参数,即数组的长度,这个等价于lambda表达式x->new int[x]
Java有一个限制,无法构造泛型类型T的数组。数组构造器引用对于克服这个限制很有用。
Person[] people = steam.toArray(Preson[]::new
变量作用域
lambda一共有三个部分
1.一个代码块
2.参数
3.自由变量的值,这是指非参数而且不在代码中定义的变量。
在lambda中存在一个自由变量的值,(具体实现细节,可以把一个lambda表达式转换为半包含一个方法的对象,这样自由变量的值就会复制到这个对象的实例中)
lambda表达式就是闭包。
lambda捕获的值必须是实际上的最终量,也就是说这个变量在初始化之后不会改变。lambda表达式中声明一个与局部变量相同的参数,局部变量不合法,因为表达式与嵌套快有相同的作用域。在一个lambda表达式中使用this关键字时,是指创建这个lambda表达式的方法的this参数
处理lambda表达式
使用lambda方法是为了延迟执行,以后执行的原因:
1.在一个单独的线程中运行代码
2.多次运行代码
3.在算法的适当顺序运行代码
4.发生某种情况时运行代码
5.只在必要时才能运行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值