Lambda表达式是一个匿名函数,是在jdk1.8中添加的
在jdk1.8之前,我们只能使用匿名方法和继承接口来实现接口中定义的方法
Lambda表达式的使用也是有限制的,Lambda表达式只能在接口中有且只有一个未实现的方法中使用
因此,在jdk1.8中还添加了一个 default的关键字,被default所标注的方法必须写一个默认实现
首先我们先定义几个接口,这些接口的定义只是为了展示Lambda表达式的方便
/**
* 无返回值的接口
* @author Administrator
*
*/
interface SingleParameter
{
void printin(Object msg);
}
/**
* 有返回值的接口
* @author Administrator
*
*/
interface SingleParameterReturn
{
Integer triploid(Integer num);
}
/**
* 多参数有返回值的接口
* @author Administrator
*
*/
interface MultiParameterReturn
{
Integer triploid(Integer num,Integer num2);
}
/**
* 无参有返回值的接口
* @author Administrator
*
*/
interface PersonCreater {
Person getPerson();
}
/**
* 返回值对象
* @author Administrator
*
*/
class Person{
private LambdaDemo demo;
public Person()
{
demo=LambdaDemo.getLambdaDemo();
}
public LambdaDemo getDemo() {
return demo;
}
}
定义好接口后我们来使用Lambda表达式来操作
SingleParameter singleParameter=s->{System.err.println(s);}; // 这是无返回值的lambda表达式
singleParameter.printin("这是无返回值的lambda表达式");
因为
SingleParameter 接口中只有一个
void printin(Object msg); 方法未实现
所以
s->{System.err.println(s);}; 这条代码我们可以看成是实现了那个方法
s代表方法中的msg
->代表指向方法体
{System.err.println(s);}代表方法的实现
无返回值的方法实现了我们再来看有返回值的SingleParameterReturn是怎么实现的
SingleParameterReturn singleParameterReturn=s->s*3; // 这是无返回值的lambda表达式
System.err.println(singleParameterReturn.triploid(12));
SingleParameterReturn中的未实现方法是
Integer triploid(Integer num);
然而我们在上面的代码中只写了这么一小段代码就能代替这个方法
s->s3
s还是一样代表方法中的num
->指向方法体
s3其实是等于 return s*3;的 上面那个只是一种简写
既然单参数的都理解了,那么我们再来看多参数的Lambda表达式
MultiParameterReturn multiParameterReturn=(s,m)->s*m; // 这是有返回值的多参数的lambda表达式 多参数时必须加上小括号
System.err.println(multiParameterReturn.triploid(12,30));
MultiParameterReturn 中的未实现方法是
Integer triploid(Integer num,Integer num2);
Lambda表达式是
(s,m)->sm
其实聪明的人已经看出来这是什么意思了
s代表num
m代码num2
->指向方法体
sm其实就是返回两个数相乘
既然单参数多参数的都理解了,那么我们难度升级 Lambda表达式中调用其他类的方法
SingleParameter singleParameter2=System.err::println; // 这是调用其他类的方法的lambda表达式
singleParameter2.printin("这是调用其他类的方法的lambda表达式");
System.err::println;
这条代码的意思其实很简单
::前是调用的对象
::后是调用的方法
这就相当于用System.err.println();来代替我们的方法
看似难度升级,其实理解了也是一样简单
我们再来最后一个使用Lambda表达式来创建实现方法中的对象对象
PersonCreater p1=()->new Person(); //这是创建对象的lambda表达式
PersonCreater p2=Person::new; //这是创建对象的lambda表达式 这种写法等价于上面那种写法
System.err.println(p1.getPerson().getDemo()==p2.getPerson().getDemo());
第一个是不是贼简单
()代表空方法
->执行方法体
new Person() 实现方法返回创建的对象
第二个可能稍微难一点
但看到他两都是创建这个接口对象,那就说明
()->new Person();和Person::new;
内部实现是一样的
Person就是代表操作对象
new 代表创建这个对象
所有最后就是返回创建的对象
以上就是Lambda的简单使用
最简单的例子
List中的forEach
他就是将Lambda的使用展现的淋漓尽致
他不仅减少了代码的数量还提高的代码的运行速度
从List的使用来看
Lambda表达式不出意外的话将会是以后开发的趋势