Lamdba 匿名类

在J2SE 8中,支持通过Lamdba表达式类创建匿名类。


  • 表达式


格式:(参数列表) -> {方法实现} ,其中:

当参数类型省略时,自动默认上下文获取;

 当参数个数只有一个,两边括号可略; 

当方法实现只有单个表达式,两边括号可略。


示例:

(int a, int b) -> { return a + b; }
(a, b) -> a + b
a -> a
() -> 10


  • 代码实现


要求如下:

1、JDK版本要求1.8

2、目标方法参数为@FunctionalInterface修饰的接口类


示例:

@FunctionalInterface
static interface WeightFatorFunction {
	float accept(float key, float value);
}

static class People{
	
	float weight;
	float hight;
	
	public People(float weight, float hight) {
		this.weight = weight;
		this.hight = hight;
	}

	public float getFactor(WeightFatorFunction fi){
		return fi.accept(weight, hight);
	}
}

static void main(String[] args){

/**
 * 体质指数(BMI)=体重(kg)÷身高^2(m)
 * 
 * 过轻:低于18.5
 * 正常:18.5-24.99
 * 过重:25-28
 * 肥胖:28-32
 * 非常肥胖, 高于32
 */
System.out.println(new People(55.0f, 1.70f).getFactor((float w, float h) -> { return w / (h*h); } ));;
System.out.println(new People(55.0f, 1.70f).getFactor((w, h) -> w / (h*h) )); // 同上
}


系统相关:

// 列表

List<Employee> list = new ArrayList<>();
list.add(new Employee("Nick"));
list.add(new Employee("Josh"));
list.add(new Employee("Robin"));

list.forEach(a -> {
	System.out.println(a);
});


// 键值对

Map<String, Employee> map = new HashMap<>();
map.put("0001", new Employee("Nick"));
map.put("0002", new Employee("Josh"));
map.put("0003", new Employee("Robin"));

map.forEach((k, v) -> {
	System.out.println(k + "," + v);
});


  • 其他


对闭包的理解:由于内部函数存在外部引用,导致该函数所处的包无法正常回收,此时包所处的状态就是闭包。

为什么是函数被引用,而不是变量么?因为只有函数才会对其所处包的其他属性或访问存在访问需求。

在js中,函数和包由function来扮演。可以将外面的(或父类的)函数称之为包函数。此时的包函数就像是一个皮包,

对于一个匿名函数来说,函数执行完毕,其包将不存在任何索引,就像包的拉链被闭合,此时如果内部函数被返回并引用,就像一条细绳从拉链的一个位置延伸出来,通过细绳可以访问包的资源,而包也不会被垃圾回收。


Lamdba表达式仅仅只是一个匿名类的实现而已,自然与闭包无关。java如何支持闭包的,还需要各位大大指点。


Java8的其他特征

“::” 双引用,支持对静态方法的调用等;

“default” 支持在接口类中提供默认方法,除此以外,还支持“static”修饰的方式;

支持匿名类访问其外部变量,但不允许修改。




你可能感兴趣的:(java,闭包,Lamdba)