又是一年平安夜,平安夜对我来说有个特殊的意义。如今一人闲来无事整理一下觉得有意思的lambda,可能描述的不清和错误的地方,请大家指出批评。
lambda是一种函数式编程
jdk1.8之前如果我们想使用一个接口定义的功能,首先要先创建实现类,再创建是一实现类的对象 这样就受到了很多的语法限制。为了使用接口的功能必须创建对象 ,为了创建对象必须实现一个类 即使使用匿名内部类也十分的麻烦
传统代码:
//接口
package lambda简单例子;
public interface Eat {
public abstract void eatFood(String sting);
}
//匿名内部类实现接口代码
package lambda简单例子;
public class TestDemo {
public static void main(String[] args) {
Eat eat=new Eat() {
@Override
public void eatFood(String string) {
System.out.println(string+"正在吃饭");
}
};
eat.eatFood("匿名内部类");
}
}
我们只是想使用Eat接口的eatFood的方法 却要做一些列不相干的工作 ,为了简化代码可以使用lambda
package lambda简单例子;
public class TestDemo {
public static void main(String[] args) {
Eat eat=new Eat() {
@Override
public void eatFood() {
System.out.println("匿名内部类正在吃饭");
}
};
eat.eatFood();
Eat eat1=string->System.out.println(string+"正在吃");
eat1.eatFood("lambda");
}
}
会同时输出匿名内部类正在吃饭和lambda正在吃 ,极大了简化了程序中的不必要代码 。只需要注重eatFood中要重写的方法体,只需要定义参数以及方法体即可。(可以看作是匿名内部类的语法糖,但不是,注意这种想法只是帮助理解,底层并不是这样实现)
lambda表达式的标准格式为()->{}; 使用的要求 :
1 必须是一个接口
2 接口中有且仅有一个抽象方法需要实现
接下来我们使用一个更有实际意义的代码来演示lambda,并说明lambda的什么时候可以省略
首先我们要知道Collections是jdk提供的一个集合(set,map)的工具类,sort(参数1,参数2)是其提供的一个排序工具
参数1 是要进行排序的集合 参数2 是一个Comparator对象 Comparator是一个接口必须重写compare方法
代码如下
//Student的标准javaBean类
package lambda练习;
public class Student {
int age;
public Student(int age) {
this.age = age;
}
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
}
//
package lambda练习;
//使用lambda的前提
//是一个接口
//并且只有一个抽象方法,但是可以有其他默认 静态 私有 方法
import java.util.ArrayList;
import java.util.Collections;
public class TestDemo01 {
public static void main(String[] args) {
ArrayList<Student> arrayList=new ArrayList<>();
arrayList.add(new Student(19));
arrayList.add(new Student(20));
arrayList.add(new Student(17));
arrayList.add(new Student(10));
arrayList.add(new Student(25));
Collections.sort(arrayList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//倒叙排序
return o2.age-o1.age;
}
});
//使用lambd表达式语法
//固定格式(参数列表)->{方法体;返回值;}
Collections.sort(arrayList,(Student o1,Student o2)->{return o2.age-o1.age;} );
System.out.println(arrayList);
//省略格式的lambd语法
Collections.sort(arrayList,( o1, o2)->o1.age-o2.age);
System.out.println(arrayList);
}
}
lambda的标准格式为:(参数名...)->{方法体 ;}
省略的要求:
参数有且仅有一个的时候()可以省略
方法体中只有return语句时,{},return,括号中的分号均可以省略