函数式编程思想:
只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程。
Lambda表达式
一些参数 一个箭头 一段代码
(参数类型 参数名称)->{代码语句}
(参数列表)->{一些重写方法的代码};
使用lambda表达式,实现多线程
new Thread(()->{
syso;}).start();
()=run的()有参数的话就在里面写,没有就空着,多个参数用,分开
->把括号参数传到中括号语句来
{}重写接口的方法体
//省略格式
new Thread(()->syso).start();
Lambda省略格式:
可推导可省略
可省略内容:
1.(参数列表):括号中参数列表的数据类型,可以省略不写
2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
3.{一些代码}:如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号 )但必须一起省略
Arrays.sort(arr,(Person o1, Person o2)->{ return o1.getAge()-o2.getAge();});
//省略版
Arrays.sort(arr,(o1, o2) -> o1.getAge()-o2.getAge());
cal(100,200,(int a,int b)->{ return a+b; });
//省略版
cal(200,300,(a,b)->a+b);
Lambda使用前提
1.Lambda必须具有接口,且要求接口中有且仅有一个抽象方法
无论是内置的Runnable Comparator接口还是自定义接口,只要有当接口中的抽象方法存在且唯一时,才可以使用
2.必须具有上下文推断
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为“函数式接口”。
额外知识
1.面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。
使用匿名内部类,实现多线程程序
Runnabble r=new Runnable(){
@Overriide
run
};
new Thread®.start();
更加简化
new Thread(new Runnable(){
@Override
run
}).start();
为了调用不得不创建类。
匿名内部类
好处可以帮我们省去实现类的定义,弊端它的语法太复杂
2. 递归:
方法自己调用自己
递归的分类:直接递归和间接递归
直接递归为方法自身调用自己
间接递归可以A调用B,B调用C,C方法调用A方法。
注意: 递归一定要有条件限定,保证地递归能够停止下来,否则发生栈内存溢出 递归虽有限定条件,但次数不能太多,否则也会发生溢出
构造方法,禁止递归
使用前提:
当调用方法的时候,方法主体不变,每次调用方法的参数不同,可以使用递归