参考:集合进阶-01-单列集合顶层接口Collection_哔哩哔哩_bilibili
目录
Arrays
操作数组的工具类
重载的sort方法
Lambda表达式
函数式编程
函数式编程是一种思想特点
面向对象:先找对象,让对象做事情
函数式编程思想,忽略面向对象的复杂语法,强调作什么,而不是谁去做。
Lambda表达式是JDK8开始后的一种新语法形式
如果满足函数式接口的要求,加上注解后不会报错;如果不满足要求,加上注解后会报错。
调用一个方法的是时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象,如果实现类对象只要用到一次,就可以用匿名内部类的形式进行书写。
总结
Lambda表达式的基本作用:简化函数式接口的匿名内部类的写法
Lambda表达式有什么使用前提:必须是接口的匿名内部类,接口中只能有一个抽象方法
Lambda的好处:Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使java语言表达嫩里得到了提升。
Lambda表达式的省略写法
省略核心:可推到可省略
Lambda省略规则:
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果Lambda表达式的方法体只有一行,大括号、分号、return可以省略不写,需要同时省略。
Lambda表达式简化Comparator接口的匿名形式
练习题
字符串比较:
第一题
测试类:
public class Test1 {
public static void main(String[] args) {
GirlFriend gf1 = new GirlFriend("xiaoshishi", 18, 1.67);
GirlFriend gf2 = new GirlFriend("xiaodandan", 19, 1.72);
GirlFriend gf3 = new GirlFriend("abc", 19, 1.78);
GirlFriend[] arr = {gf1, gf2, gf3};
Arrays.sort(arr, (o1, o2) -> {
//排序规则
double temp = o1.getHeight() - o2.getHeight();
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));
}
}
第二题 不死神兔
特点:从第三个数据开始,是前两个数据和(斐波那契数列)
第三题 猴子吃桃子
public class Test3 {
public static void main(String[] args) {
System.out.println(getSum(9));
}
public static int getSum(int day){
if(day == 10){
return 1;
}
return (getSum(day + 1) + 1 )* 2;
}
}
第四题 爬楼梯
如果将题目改为:
有时候一次爬一个台阶,有时候一次爬两个台阶,有时候一次爬三个台阶
public class Test4 {
public static void main(String[] args) {
System.out.println(getCount(20));
}
private static int getCount(int n) {
if(n == 1){
return 1;
}
if(n == 2 ){
return 2;
}
if(n == 3){
return 4;
}
return getCount(n - 1) + getCount(n - 2) + getCount(n - 3);
}
}