1.()对应着方法的形参
2.->固定格式
3.{}对应着方法的方法体
注意点:
Lambda表达式可以简化匿名内部类的书写
Lambda表达式只能简化函数式接口的匿名内部类的写法
函数式接口:
有且仅有一个抽象方法的接口叫做函数式接口,接口上面可以加@Functionalnterface注解
package MyApi.Lambda;
public class a01LambdaDmo01 {
public static void main(String[] args) {
//1.利用匿名内部类的方式调用下面的方法
//调用一个方法的时候,如果方法的参数是一个接口,那么我们要传递这个接口的实现类对象
//如果实现类的对象只要用到一次,就可以用匿名内部类的方式进行书写。
method(new Swim() {
@Override
public void swimming() {
System.out.println("正在游泳----");
}
});
//2。利用lambda表达式
method(
()->{
System.out.println("正在游泳----");
}
);
}
public static void method(Swim s)
{
s.swimming();
}
@FunctionalInterface
interface Swim{
public abstract void swimming();
}
}
省略规则:
1.参数类型可以省略不写
2.如果只有一个参数,参数的类型可以省略,同时()也可以省略。
3.如果lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
package MyApi.Lambda;
import java.util.Arrays;
import java.util.Comparator;
public class a02lambdaDemo02 {
public static void main(String[] args) {
String[] arr={"a","aaaaa","aaa","aa"};
//法一
Arrays.sort(arr,( o1, o2) ->
o1.length()-o2.length()
);
System.out.println(Arrays.toString(arr));
}
}
定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序。
要求1:属性有姓名、年龄、身高
要求2:按照年龄大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的首字母进行排序。
package MyApi.Lambda.Test;
import java.util.Arrays;
import java.util.Comparator;
public class Test1 {
public static void main(String[] args) {
//1.创建三个女朋友对象
girlFriend g1=new girlFriend("karry",18,1.73);
girlFriend g2=new girlFriend("jason",19,180);
girlFriend g3=new girlFriend("roy",19,1.78);
//2.定义数组存储女朋友信息
girlFriend[] arr={g1,g2,g3};
//3.利用arrays中的sort方法进行排序
/* Arrays.sort(arr, new Comparator() {
@Override
public int compare(girlFriend o1, girlFriend o2) {
double temp=o1.getAge()-o2.getAge();
temp=temp==0?o1.getHeight()-o2.getHeight():temp;
temp= temp==0?o1.getName().compareTo(o2.getName()):temp;
if(temp>0){
return 1;
}else if(temp<0){
return -1;
}else {
return 0;
}
}
});
*/
//lambda表达式改写的结果
Arrays.sort(arr,(o1, o2)-> {
double temp=o1.getAge()-o2.getAge();
temp=temp==0?o1.getHeight()-o2.getHeight():temp;
temp= temp==0?o1.getName().compareTo(o2.getName()):temp;
if(temp>0){
return 1;
}else if(temp<0){
return -1;
}else {
return 0;
}
}
);
//展示数组的内容
System.out.println(Arrays.toString(arr));
}
}
有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十二月的兔子对数为多少。
package MyApi.Lambda.Test;
public class Test2 {
public static void main(String[] args) {
/*//方法1
//1.创建一个长度为12的数组
int []arr=new int[12];
//2.手动给0索引和1索引的数据进行赋值
arr[0]=1;
arr[1]=1;
//3.利用循环给剩余的数据进行赋值
for (int i = 2; i < arr.length; i++) {
arr[i]=arr[i-1]+arr[i-2];
}
//获取最大索引上的数据
System.out.println(arr[11]);*/
//法2:
System.out.println(getSum(12));
}
public static int getSum(int month){
if(month==1||month==2){
return 1;
}
return getSum(month-1)+getSum(month-2);
}
}
有一堆桃子,猴子第一天吃了其中的一半,并多吃一个,以后每天猴子都吃当前剩下的一半,然后在多吃一个,第10天的时候还没吃,发现只剩下一个桃子了,问最初总有几个桃子。
package MyApi.Lambda.Test;
public class Test3 {
public static void main(String[] args) {
System.out.println(getCount(1));
}
public static int getCount(int day){
if(day<=0||day>=11){
System.out.println("当前时间错误");
return -1;
}
//递归出口
if(day==10){
return 1;
}
//书写规律
//每一天的桃子的数量都是后一天数量加一乘以2
return (getCount(day+1)+1)*2;
}
}
可爱的小明特别喜欢爬楼梯,它有时候一次爬一个台阶,有时候一次爬两个台阶,如果这个楼梯有两个台阶,小明一共有多少种爬法呢
package MyApi.Lambda.Test;
public class Test4 {
public static void main(String[] args) {
System.out.println(getCount(20));
}
public static int getCount(int n){
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return getCount(n-1)+getCount(n-2);
}
}