1.Lambda表达式的介绍
函数式编程思想:
在面向对象的语言中我们过分强调用对象来做事情所以会导致代码过于冗余,而函数式编程思想
尽量忽略面向对象的复语法,强调做什么事情,而不是以什么形式做。
举例面向对象线程创建的冗余代码:
public class DemoLambda {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程实现");
}
}).start();
}
}
而在函数式编程思想中:
public class DemoLambda {
public static void main(String[] args) {
new Thread(()-> {System.out.println("线程实现");}).start();
}
}
可以看出极大的简化了代码,提高了代码的可读性。
着这里介绍下函数式接口,接口中只有一个抽象方法的接口称为函数式编程接口,可以理解为这些接口就是
用来为Lambda表达式服务的。
2.Lambda表达式的语法
Lambda 表达式的基础语法:
Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符
箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
现在让我们来正式了解下Lambda表达式的用法
public class DemoLambda {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程实现1");
}
}).start();
new Thread(()-> {System.out.println("线程实现2");}).start();
}
}
/**
* 在这里可以看出,Lambda表达式将接口名称和方法名称都省略了:
*
* 我是这样理解的:
*
* Thread的构造方法中已经规定了需要接受一个Runnable接口的实现类而Runnable接口为函数式编程接口,
* 即只有一个抽象方法,所以这个方法名称也可以省略:
*
* 故只剩下一个(参数列表)->{方法体}也就是Lambda表达式
* */
Lambda表达式的分类(根据接口中的方法签名分类)
1.无参数无返回值
()->{System.out.println("无参数无返回值"); }
此时当方法体只有一行时方法体也可省略
()->System.out.println("无参数无返回值")
2.无参数有返回值
() -> { return 1+2 ;}
在这里因为Lambda表达式是可省略可推导的,所以参数列表的类型也可以省略,又因为方法体只有一句,所以return
依然可以省略;
() -> 1+2
3.有参数无返回值
(x) -> System.out.println(x)
4.有参数有返回值
(int x )->{return x;}
在这里因为Lambda表达式是可省略可推导的,所以参数列表的类型也可以省略,又因为方法体只有一句,所以return
依然可以省略;
(x)->x
因为上面大概都差不多所以现在给一个有参数有返回的Demo(老铁们体谅)
public interface Math {
public abstract int add(int a,int b);
}
public class DemoLambda {
public static void main(String[] args) {
invokeAdd(10,20,(a,b)->a+b);
}
public static void invokeAdd(int a,int b, Math c){
System.out.println( c.add(a, b));
}
}
希望老哥们多多支持!!!