使用lambda表达式前后区别
@Test
public void test1(){
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("我测尼玛");
}
};
r1.run();
System.out.println();
Runnable r2=() -> System.out.println("我测尼玛");
r2.run();
}
@Test
public void Test2(){
Comparator<Integer> comparable=new Comparator<Integer>() {
@Override
public int compare(Integer o1,Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare = comparable.compare(32, 21);
System.out.println(compare);
Comparator<Integer> comparable1=(o1,o2) -> Integer.compare(o1,o2);
int compare1 = comparable1.compare(32, 21);
System.out.println(compare1);
Comparator<Integer> comparable2=Integer :: compare;
int compare2 = comparable2.compare(32, 21);
System.out.println(compare2);
}
Lambda表达式的使用
1.举例(o1,o2)-> Integer.compare(o1,o2);
2.格式:
->:Lambda表达式的操作符
左边:lambda形参列表,其实就是接口中的抽象方法的形参列表
右边:lambda体,其实就是重写的抽象方法的方法体
3.Lambda表达式的使用:6种
4.Lambda表达式的本质,作为函数式接口的实例
5.如果接口只有一个抽象方法,此接口就是函数式接口
在一个接口上使用@FunctionalInterface注解,表示它是一个函数式接口
以前用匿名实现类表示的现在都可以用Lambda表达式来写
总结:
六种形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfCytm78-1665566586793)(C:\Users\zhangshuaibao\AppData\Roaming\Typora\typora-user-images\image-20221012155043126.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVj41QtP-1665566586795)(C:\Users\zhangshuaibao\AppData\Roaming\Typora\typora-user-images\image-20221012155058747.png)]
如果接口只有一个抽象方法,此接口就是函数式接口
在一个接口上使用@FunctionalInterface注解,表示它是一个函数式接口
当需要对一个函数式接口实例化时,可以使用lambda表达式
Java内置的4大核心函数式接口
何时使用函数接口?
如果开发中需要定义一个函数式接口,首先看在已有的jdk提供的函数式接口是否提供了能满足需求的函数式接口,如果有,则直接调用,不需要自己自定义
使用情景:当要传递给lambda体的操作,已经实现的方法了,可以使用方法引用
理解:方法引用可以看作lambda表达式深层次的表达。换句话说,方法引用就是lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法
情况:
对象::非静态方法
类::静态方法
类::非静态方法
要求:接口中的抽象方法形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同
当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:ClassName::methodName
使用建议:如果给函数式接口提供实例,切好满足方法引用的使用情景,可以使用方法引用给函数式接口提供实例
理解:Stream关注的是对数据的运算,与CPU打交道,集合关注的是数据的存储,与内存打交道
注意点:
Stream的使用流程:
//创建Stream方式一:通过集合
@Test
public void Test1(){
List<Employee> employees = EmployeeData.getEmployees();
//default Stream stream() 返回一个顺序表
Stream<Employee> stream=employees.stream();
//default Stream parallelStream() 返回一个并行流
Stream<Employee> employeeStream = employees.parallelStream();
}
//创建Stream方式二:通过数组
@Test
public void Test2(){
int[] arr={1,2,3,4,5,6};
//调用Arrays类的static Stream stream(T[] array):返回一个流
IntStream stream = Arrays.stream(arr);
Employee e1=new Employee(1001,"Tom");
Employee e2=new Employee(1002,"Jerry");
Employee[] employees = {e1, e2};
Stream<Employee> stream1 = Arrays.stream(employees);
}
//创建Stream方式三:通过Stream的of()
@Test
public void Test3(){
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
}
///创建Stream方式四:创建无限流
@Test
public void Test4(){
// 迭代
// public staic Stream iterable(final T seed,final UnaryOperator f)
//遍历前10个偶数
Stream.iterate(0,t ->t+2).limit(10).forEach(System.out::println);
// 生成
// public static Stream generate(Supplier s)
Stream.generate(Math::random).limit(10).forEach(System.out::println);
}
使用流程的注意点:
理解:为了在程序中避免出现空指针异常而创建的
常用方法:
例子:
@Test
public void Test1(){
Girl girl = new Girl();
girl=null;
//of(T t):保证t是非空的
Optional<Girl> optionalGirl = Optional.of(girl);
}
@Test
public void Test2(){
Girl girl = new Girl();
girl=null;
//ofNullable(T t):t可以为null
Optional<Girl> optionalGirl = Optional.ofNullable(girl);
System.out.println(optionalGirl);
}
public String getGirlName(Boy boy){
return boy.getGirl().getName();
}
@Test
public void Test3(){
Boy boy=new Boy();
boy=null;
String girlName=getGirlName(boy);
System.out.println(girlName);
}
//优化
public String getGirlName1(Boy boy){
if(boy!=null){
Girl girl=boy.getGirl();
if(girl!=null){
return girl.getName();
}
}
return null;
}
@Test
public void Test4(){
Boy boy=new Boy();
boy=null;
String girlName=getGirlName1(boy);
System.out.println(girlName);
}
@Test
public void Test5(){
Girl girl = new Girl();
// girl=null;
//ofNullable(T t):t可以为null
Optional<Girl> girl1 = Optional.ofNullable(girl);
//orElse(T t1):如果当前的Optional内部疯传的t是非空的,则返回内部的t
//如果内部的t是空的,则返回orElse方法中的t1
Girl orElse = girl1.orElse(new Girl("丁真"));
System.out.println(orElse);
}
//使用Optional
public String getGirlName2(Boy boy) {
Optional<Boy> boyOptional=Optional.ofNullable(boy);
Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴")));
Girl girl = boy1.getGirl();
Optional<Girl> girlOptional=Optional.ofNullable(girl);
Girl girl1 = girlOptional.orElse(new Girl("马儿扎哈"));
return girl1.getName();
}
@Test
public void Test6(){
Boy boy=null;
// boy=new Boy();
// boy=new Boy(new Girl("丁真"));
String girlName=getGirlName2(boy);
System.out.println(girlName);
}
e(new Girl("马儿扎哈"));
return girl1.getName();
}
@Test
public void Test6(){
Boy boy=null;
// boy=new Boy();
// boy=new Boy(new Girl("丁真"));
String girlName=getGirlName2(boy);
System.out.println(girlName);
}