Lambda表达式
面向对象:做一件事情,找一个能解决这个事情的对象,调用对象的方法来完成事情。
**函数式编程思想:**只要能获取到结果,谁去做的,怎么做的不重要,结果为主,不考虑过程。
冗余的Runnable代码:
方法的名称,返回值和调用方法需要实现相应的类。均是冗余的代码。
public class RunableImpl implements Runnable{
public void run(){
sout.println("新的线程创建了");
}
}
public class Demo{
public static void main(String[] args){
RunableImpl run = new RunnableImpl();
Thread t = new Rhread(run);
t.start();
}
//简化写法
new Thread(new Runnable(){
public void run(){
sout.println("新的线程创建了");
}
}).start();
}
一、使用lambda表达式实现多线程
()参数类表 ->将前面的参数传递给后面的{}内容
public class RunableImpl implements Runnable{
public void run(){
sout.println("新的线程创建了");
}
}
public class Demo{
public static void main(String[] args){
RunableImpl run = new RunnableImpl();
Thread t = new Rhread(run);
t.start();
}
//Lambda写法
new Thread(()->{
sout.println("新的线程创建了");
}
).start();
}
二、Lambda标准格式
标准格式由三部分构成:
**一些参数:(**参数) 接口中抽象方法的参数列表。
一个箭头:把参数传递给方法体。
一段代码:{具体方法体}
(参数列表)->{一些重写方法的代码}
1.无参无返回类型
public interface Cook{
void makeFood();
}
public class DemoInvokeCook{
public static void main(String[] args){
incokeCook(()->{
System.out.println("吃饭了");
});
}
public static void invokeCook(Cook cook){
cook.makeFood();
}
}
2.使用数组存储多个person对象,对数组中的Person使用Array的sort方法按照年龄升序排序。
class Person{
String name;
Integer age;
get&set();
}
public class DemoIperson{
public static void main(String[] args){
Person[] arr={
new Person("张三",19);
new Person("李四",20);
new Person("王五",15);
};
Arrays.sort(arr,new Comparator<Persion>(){
public int compare(Person 01,Person o2){
return 01.getAge()-o2.getAge();
}
});
//lambda
Arrays.sort(arr,(Person 01,Person o2)->{ return 01.getAge()-o2.getAge();});
}
}
3.有参数有返回值
package com.yuwendeng.Lambda;
public interface Calculator {
public abstract int calc(int a,int b);
}
package com.yuwendeng.Lambda;
public class Demo {
public static void main(String[] args) {
invokeCalc(10, 20, new Calculator() {
@Override
public int calc(int a, int b) {
return a+b;
}
});
//lambda表达死
invokeCalc(10,20,(int a,int b)->{return a+b;});
}
public static void invokeCalc(int a,int b,Calculator c){
int sum = c.calc(a,b);
System.out.println(sum);
}
}
三、lambda省略格式和使用前提
(参数列表)->{一些重写方法的代码}
-
参数列表的数据类型可以不写
-
参数只有一个,类型和()都可以省略
-
如果{ }中的语句如果只有一行,可以省略{},还可以省略return 以及 ;(要省略,三者同时省略)···
invokeCalc(10,20,(a,b)-> a+b);//省略后
invokeCalc(10,20,(a,b)-> a+b);//省略前
使用前提;
必须有接口,只能有一个抽象方法;
必须有上下文推断。
说明:
有且只有一个抽象方法的接口称为函数式接口。