目录
1、 函数式编程思想概述
2、冗余的Runnable代码
代码分析:
对于 Runnable 的匿名内部类用法,可以分析出几点内容:
Thread 类需要 Runnable 接口作为参数,其中的抽象 run 方法是用来指定线程任务内容的核心;为了指定 run 的方法体,不得不需要 Runnable 接口的实现类;
为了省去定义一个 RunnableImpl 实现类的麻烦,不得不使用匿名内部类;
必须覆盖重写抽象 run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
而实际上,似乎只有方法体才是关键所在。
编程思想的转换:做什么,而不是怎么做!看重的是最终的结果,而不是实现结果的过程。
3、体验Lambda的更优写法
借助Java 8的全新语法,上述 Runnable 接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效:
public class Demo02LambdaRunnable {
public static void main(String[] args) {
new Thread(() ‐> System.out.println("多线程任务执行!")).start(); // 启动线程
}
}
这段代码和刚才的执行效果是完全一样的,可以在1.8或更高的编译级别下通过。从代码的语义中可以看出:我们
启动了一个线程,而线程任务的内容以一种更加简洁的形式被指定。
不再有“不得不创建接口对象”的束缚,不再有“抽象方法覆盖重写”的负担,就是这么简单!
4、回顾匿名内部类
public class Demo04ThreadNameless {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println("多线程任务执行!");
}
}).start();
}
}
5、Lambda标准格式
6、练习使用Lambda的标准格式
7、Lambda的参数和返回值
package com.dzg.lambda;
import com.dzg.domain.Person;
import java.util.Arrays;
import java.util.Comparator;
public class TraditionalSortAge {
public static void main(String[] args) {
Person[] peoples = {
new Person("张三",20),
new Person("李四",30),
new Person("王五",18)
};
/**
* 匿名内部类
*/
Comparator<Person> comp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
Arrays.sort(peoples,comp);
for (int i = 0; i < peoples.length; i++) {
System.out.println(peoples[i]);
}
}
}
Lambda写法:
package com.dzg.lambda;
import com.dzg.domain.Person;
import java.util.Arrays;
import java.util.Comparator;
public class TraditionalSortAge {
public static void main(String[] args) {
Person[] peoples = {
new Person("张三",20),
new Person("李四",10),
new Person("王五",18)
};
/**
* 匿名内部类
*/
Comparator<Person> comp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
Arrays.sort(peoples,comp);
/**
* Lambda形式
*/
/*Comparator<Person> comp = (o1, o2) -> o1.getAge() - o2.getAge();
Arrays.sort(peoples,(o1, o2) -> o1.getAge() - o2.getAge());
*/
Arrays.sort(peoples,(Person p1,Person p2) -> p1.getAge() - p2.getAge());
for (Person person:
peoples) {
System.out.println(person);
}
/*for (int i = 0; i < peoples.length; i++) {
System.out.println(peoples[i]);
}*/
}
}
Lambda标准有参数的格式:
8、Lambda省略格式
package com.dzg.lambda.standard; public class DemoInvokeCook { public static void main(String[] args) { invokeCook(() -> { System.out.println("吃饭啦"); }); invokeCook(() -> System.out.println("吃饭啦")); } private static void invokeCook(Cook cook){ cook.makeFood(); } }
9、Lambda使用前提