lambda 表达式的运用 实质是为了方便
而表达式 实质就是我们平时在码代码的时候写的式子——诸如条件语句 或者判定的语句
1、常见的方法
比如 使用增强型for循环遍历整个容器类且这个容器类泛型是——Integer 若要在其中添上if语句判定找出合乎要求的数字 就得有相应约束的式子
2、匿名类来实现
提供一个接口 之后定义一个类implements该接口
Te t=new Te() {
public void sf()
{
}
};
其中 方法 sf() 就是你需要往里加入条件语句以实现代码功能
注意 方法返回的数据类型 以及return一般是你写的语句 而不是具体的一个变量 之后再把接口实例化的对象放入主要实现的另一个方法 设置参数即可
private static void filter(List<Hero> heros,Te R)
{
}
在调用以上方法的时候 可以不用传Te这个类型的参数 可以直接放表达式
3、以上两个方式都是循序渐进介绍lambda表达式
以下是lambda表达式的正确写法
代码示例——便于讲解:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
public class collection_test {
public static void main(String[] args) {
collection_test df=new collection_test();
Random sd=new Random();
List<Hero> L=new ArrayList<>();
for (int i = 0; i < 10; i++) {
L.add(new Hero("Hero-"+i,sd.nextInt(100),sd.nextInt(100)));
}
System.out.println(L);
Te t=new Te() {
public boolean sf(Hero h)
{
if(h.blood<80&&h.damage<90)
{
return true;
}
else
{
return false;
}
}
};
Comparator<Hero> h=new Comparator<Hero>() {
public int compare(Hero o1,Hero o2)
{
if(o1.blood<o2.blood)
return 1;
else
return -1;
}
};
Collections.sort(L,h);
System.out.println(L);
df.seek(L, t);
}
public void seek(List<Hero> k,Te e)
{
for (Hero hero : k) {
if(e.sf(hero))
{
System.out.println(hero);
}
}
}
}
Hero类
public class Hero{
public String name;
public int blood;
public int damage;
public Hero() {
}
public Hero(String name,int blood,int damage)
{
this.name=name;
this.blood=blood;
this.damage=damage;
}
public String toString()
{
return name+"-"+blood+"-"+damage;
}
}
强调 注意:
再则之前 对于Hero类中的toString() 方法的重写 是注意到了 但是这次才真正的清楚 toString这个方法的 return语句的作用——它所返回的是实例化对象后需要输出的数据 通过‘+’ 连接每一个字符串以达到目的。因此之后的toString不只是对于String类型的数据的返回 而是这个类里的属性都可以随之一并输出,所以才为什么要注意对应输出需求重写toString
lambda表达式讲解:
代码中的语句——h.blood<80&&h.damage<90 才是真正所需要的表达式
只是实现的方式有多种
正确的lambda 表达式为:h->h.blood<80&&h.damage<90
所以也可以不用如示例代码中那样写一个匿名类 将其引用作为参数放入seek方法里——seek(L,h->h.blood<80&&h.damage<90) 即可
可以结合普通方法来理解——
for (Hero hero : k) {
if(hero.blood<80&&hero.damage<90)
{
System.out.println(hero);
}
}
注意 h->h.blood<80&&h.damage<90 式子中的h也是变量不要和其他变量重复
-> 则是lambda表达式的特征 变量加-> 后跟其语句
也有多个参数(h,e)->… 前面的参数和后面的是同一类型
得出lambda表达式是建立在原有匿名类的基础上 且->之后的语句正是匿名类方法里的整段代码的缩写 比如条件语句的三元表达式简写
可以得出 匿名类里的内容一般不多 有的只是为了实现某个方法的一小部分功能而设立的。当然也有多的 使得lambda表达式也随之增加 但是量总比匿名类中的少 不然就没有意义。
从匿名类写法来实现 压缩成 lambda表达式 可以看出实质还是在调用自定义接口的方法 只是把该方法里的条件语句直接写出来罢了
因此 得出lambda表达式也是一种匿名方法,直接将匿名方法作为参数进行传递也是一种编程思想 如同之前的空间换时间
关于eclipse不能正常识别lambda表达式的解决措施:
菜单->Window->Preferences->Java-Compiler->Compiler compliance leve: 设置为1.8即可
但是现在JDK版本都挺高的 应该不会存在 因此Java会将该匿名方法转变为匿名类方式 简洁代码。
对于lambda表达式 简短代码尤其是匿名类中语句不多且便于简写成lambda表达式 可以适用 面对企业级项目庞大复杂代码量 慎用 因为可读性差 难以调试