赞
踩
最近做项目看源码时遇到了lambda表达式,看了不少资料感觉有一句话很贴切,Lambda表达式就是匿名函数。
下面举几个栗子先来说说Lambda有啥用,为什么能简化代码,栗子就用最基本代码重构,解决多switch,case的问题。
interface Switch{ String caseRes(); } class Swtich1 implements Switch{ @Override public String caseRes() { return "第一种处理"; } } class Swtich2 implements Switch{ @Override public String caseRes() { return "第二种处理"; } } public class Lambda { private static HashMap<Integer, Switch> hashMap=new HashMap<Integer, Switch>(); static{ hashMap.put(1, new Swtich1()); hashMap.put(2, new Swtich2()); } public static void main(String[] args) { System.out.println(hashMap.get(1).caseRes()); } }
通过该方式可以解决多switch case难维护的问题,但该方式也有弊端,就是当代码逻辑并不是很复杂时创建类并实现方法导致代码过多,看上去很麻烦,此时可以用匿名类来解决。
static{
hashMap.put(1, new Switch() {
@Override
public String caseRes() {
return "第一种处理";
}
});
hashMap.put(2, new Switch() {
@Override
public String caseRes() {
return "第二种处理";
}
});
}
将static代码块改成上面代码,也就是用匿名内部类,但这样就导致重复的代码又写了很多,虽然不用创建类实现接口,但也很麻烦,这种情况就可以用到Lambda表达式了。
1.最基本的表达式:
文档中说明的Lambda表达式的格式为()->{ },左边为小括号,是参数,右边是大括号,是函数体。
static{
Switch swi1=()->{return "第一种处理";};
Switch swi2=()->{return "第二种处理";};
hashMap.put(1,swi1);
hashMap.put(2,swi2);
}
通过Lambda表达式可已发现代码简洁了很多,开头也说到lambda表达式就是一个匿名函数,使用lambda表达式与匿名内部类很想,他就是相当于用这个匿名函数代替了接口中的方法,但是此时是有前提的,由于我们的是匿名函数为了让他能够对应,接口中应该只有一个方法,如果有多个方法则表达式无效,编译无法通过,他并不知道该替换哪个方法。
2.表达式的简化,以计算两个整数的和为例
interface Add{//内部接口
int add(int a,int b);
}
public static void main(String[] args) {
Add add1 = (int a, int b) -> {return a + b;};//最基本方式
Add add2 =(a,b)->{return a+b;};//省略参数类型
Add add3 =(a,b)->(a+b);//省略return和括号
System.out.println(add1.add(1, 2));
System.out.println(add2.add(1, 2));
System.out.println(add3.add(1, 2));
}
可以省略参数类型,但是参数可括号不可以省略,即使没有参数时,当方法体的代码只有一行时花括号可以省略,return也可以省略,与if,while ,for的省略相同。
3.lambda表达时的函数引用
当想用已经实现的函数来替换接口中的函数时可以使用双冒号的方式
public class Lambda {
interface Add{
int add(int a,int b);
}
public static void main(String[] args) {
Add add4 = Lambda::add;//静态方法用类调用,普通方法用对象调
System.out.println(add4.add(1, 2));
}
public static int add(int a,int b) {
return a+b;
}
}
这个地方需要注意的是,引用的函数返回值,参数列表必须与接口中的抽象方法完全相同否则无法编译。
另外由于使用lambda表达式相当于创建对象,所以lambda表达式的复制既可以放在方法里相当于局部变量,也可以放在类中相当于类的属性使用。
java8中还给了很多的函数api接口给出了常用的几种函数接口例如Consumer可以用来作ArrayList.forEach方法的参数进行数组的遍历他的抽象方法为一个参数没有返回值。
lambda表达式与JavaScript中的箭头函数很相似有待研究。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。