利用函数式接口保存变量(闭包)

1.函数式接口可以传入外部变量,这个时候该外部变量就会被这个函数保存起来,只要每次调用函数,就可以使用这个变量

String str = "Hello";
Function<String,String> getStr = (name) -> str+","+name;
getStr.apply("user");

2.上面的代码,定义了一个函数,使用了一个外部变量 str,相当于一个打招呼,但是此时我并不知道打招呼给谁,所以打招呼的对象也是一个变量,后面使用函数的时候传进来就行,这个对象只要通过该函数就可以传进来,所以只要把函数保存起来,比如作为某个类的成员,或者放在 list 里面,你就可以在任何地方调用这个函数
3.对比传统实现

// 首先是在 java 中,你想要让外部变量直接在函数中使用,有且只有一种方法,那就是变量是全局变量
public static String str = "Hello";
private static String sayHello(String name) {
	return str+","+name;
}
// 这个时候我们要使用变量,那就是得调用这个类得 sayHello 方法(xx.sayHello),你是没有任何手段说把这个 sayHello 方法保存起来,什么时候想用就调用,所以这种方法并不灵活,而且由于是定义的类的成员,那就还得考虑要不要静态的问题,而相比上面的函数式写法,你可以在任何一个函数内部引用任何一个变量,比如你在 main 方法中或者任意一个方法中去使用,如下
public Function<String,String> getFun() {
	String str = "Hello";
	return (name) -> str+","+name;
}

4.个人理解,这样的好处就是可以给某些变量预定义操作,比如你在这里生成了一个变量,后续你想操作这个变量,你就定义一个函数,然后你可以把这个函数放到任何你想放的地方,当然不管式传统方法还是 lamda,如果引用了外部变量,是不可以对变量做修改操作的,这在 stream 中也是一个道理,stream 中引用外部的东西必须做 final 处理
5.在 IDEA 的调试中对这种函数引用的东西会有特殊的显示
在这里插入图片描述

首先是他会标注这是 lamda,然后引用的外部变量会按照引用顺序,列为 arg1,arg2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值