目录
一、出现背景
Java是面向对象的语言,除了8种简单数据类型,Java中的一切都是对象,例如 数组,字符串等,每个类创建的实例也是对象。在Java中定义的函数或方法不可能完全独立,也不能把方法作为参数或返回一个实例。
Java是面向对象的语言,属性、方法等要包装在类中,最终包装在创建的对象中, 如果需要使用某个方法时,就必须要创建对象,传递对象。
所以在Java8之后,提出了函数式编程,把函数(方法)作为参数传递。
例如------
public class LambdaDemo1 {
public void eat(){
}
public void test(Lambda lambda){
lambda.eat();
}
}
test要使用eat方法,需要将对象传入调用。
面向对象的语言中,一切都封装在类中 , 要创建具体的对象使用。
public class LambdaDemo1 {
public void eat(){
}
}
public class LambdaDemo2 {
public void test(LambdaDemo1 lambdaDemo1){
lambdaDemo1.eat();
}
public static void main(String[] args) {
LambdaDemo2 lambdaDemo2=new LambdaDemo2();
LambdaDemo1 lambdaDemo1=new LambdaDemo1();
lambdaDemo2.test(lambdaDemo1);
}
}
Java中使用方法的三种形式
创建一个Car类 有号码 名字两个属性
public class Car_Demo3 {
int num;
String name;
public Car_Demo3(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "Car{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
}
创建Car对象,并且对Car对象进行排序
public static void main(String[] args) {
ArrayList<Car_Demo3> arrayList=new ArrayList();
Car_Demo3 c1=new Car_Demo3(1,"A1");
Car_Demo3 c2=new Car_Demo3(2,"A2");
Car_Demo3 c3=new Car_Demo3(3,"A3");
Car_Demo3 c4=new Car_Demo3(4,"A4");
arrayList.add(c1);
arrayList.add(c2);
arrayList.add(c4);
arrayList.add(c3);
//方式一
arrayList.sort(new Car_Comparator);
System.out.println(arrayList);
方式一
外部类
public class Car_Comparator implements Comparator<Car_Demo3> {
@Override
public int compare(Car_Demo3 o1, Car_Demo3 o2) {
return o1.num-o2.num;
}
}
方式二
内部类
public class Car_Demo3 {
int num;
String name;
public Car_Demo3(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "Car{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
//作为内部类
class Car_Comparator implements Comparator<Car_Demo3> {
@Override
public int compare(Car_Demo3 o1, Car_Demo3 o2) {
return o1.num-o2.num;
}
}
}
方式三
匿名内部类
// 匿名内部类
arrayList.sort(new Comparator<Car_Demo3>() {
@Override
public int compare(Car_Demo3 o1, Car_Demo3 o2) {
return o1.num-o2.num;
}
});
二、Lambda 表达式简介
Lambda 表达式是一个匿名函数,直接把一个函数作为参数传递,简化匿名内部类
arrayList.sort((o1,o2)->{
return o1.num-o2.num;
});
三、Lambda 表达式的结构
Lambda 表达式可以具有零个,一个或多个参数。
可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型, 例如 (int a,int b)与 (a,b)相同
(参数列表)->{ 方法体 }
@FunctionalInterface
public interface Fly {
void fly();
}
public class Bird {
void birdFly(Fly fly){
fly.fly();
}
public static void main(String[] args) {
Bird bird=new Bird();
bird.birdFly(()->{
System.out.println("鸟会飞");
});
}
}
四、功能接口(Functional interface)
@FunctionalInterface 标注接口是一个功能函数接口,专为Lambda表达式提供, 此时接口中只能有一个抽象方法。
如果尝试在其中添加一个抽象方法,则会抛出编译时错误。