1f Lambda表达式.txt
UP 返回
1 函数式编程思想
面向对象的思想:做一件事,找一个能解决这个事情的对象,调用对象方法来完成
函数式编程思想:只要能获取结果,谁去做怎么做都不重要,重要的是结果,不重视过程
jdk1.8提供了lambda新特性
// 使用匿名内部类实现线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程创建了");
}
}).start();
// 使用Lambda表达式实现线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "线程创建了");
}).start();
2.标准格式
( 参数列表 ) -> { 一些重写方法的代码 };
说明:
():接口中抽象方法的参数列表,没有参数就空着,有就写,逗号分隔多参数
->:传递
{ }:重写接口的抽象方法方法体
2.1 无参实现
/**接口**/
public interface Cook {
public void makeFood();
}
/**Lambda实现**/
public class Demo01 {
public static void main(String[] args) {
invokeCook(() -> {
System.out.println("吃饭了");
});
}
public static void invokeCook(Cook cook) {
cook.makeFood();
}
}
2.2 有参实现
/**Person类 实现按年龄升序排列**/
public class Person {
private String name;
private int age;
//省略构造方法,get set 以及toString
}
/**实现**/
public class Demo01 {
public static void main(String[] args) {
Person[] arr = { new Person("AA", 11), new Person("BB", 20), new Person("CC", 19) };//创建数组
Arrays.sort(arr, new Comparator<Person>() { //使用匿名内部类来定义排序
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.getAge() - o2.getAge();// 年龄升序
}
});
Arrays.sort(arr, (Person o1, Person o2) -> { //使用Lambda传递参数实现
return o1.getAge() - o2.getAge();// 年龄升序
});
for (Person p : arr) {
System.out.println(p);
}
}
}
2.3 带返回值实现
/**计算接口**/
public interface Calculator {
public int cal(int a, int b);
}
/**实现**/
public class Demo01 {
public static void main(String[] args) {
invokeCal(10, 20, new Calculator() { //匿名内部类
@Override
public int cal(int a, int b) {
// TODO Auto-generated method stub
return a + b;
}
});
invokeCal(10, 20, (int a, int b) -> { //Lambda
return a + b;
});
}
public static void invokeCal(int a, int b, Calculator c) {
int sum = c.cal(a, b);
System.out.println(sum);
}
}
3.省略
Lambda表达式:可推导,可省略
可省略的内容:
1.(参数列表):括号中参数列表的数据类型可不写
2.(参数列表):括号中参数如果只有一个,那么类型和()都可以省略
3.{一些代码}:如果{}中代码只有一行,无论是否有返回值,都可以省略{},return,分号 (注意三者必须一起省略)
之前的几个例子都可以对应省略为:
new Thread(() -> System.out.println(Thread.currentThread().getName() + "线程创建了")).start();
invokeCook(() -> System.out.println("吃饭了"));
Arrays.sort(arr, (o1, o2) -> o1.getAge() - o2.getAge()
invokeCal(10, 20, (a, b) -> a + b);
4.适用前提
1.必须具有接口,且接口只有一个抽象方法
2.必须具有上下文推断
有且仅有一个抽象方法的接口称为函数式接口
DOWN 返回