1 接口
接口不是类,而是对希望符合这个接口的类的一组需求
1.1 Comparable 接口
要对对象进行比较,就要实现(implement)比较(comparable)接口
注意:
implements Comparable<Manager>Comparable接口是泛型接口
class Manager extends Employee implements Comparable<Manager> {
...
@Override
public int compareTo(Manager otherManager) {
return (int) (this.getSalary() - otherManager.getSalary());
}
}
注:extends 关键字在前,implements 关键字在后
这样比较两个 Manager 对象,就是比较他们的奖金(用 this 引用当前对象)
这样有了比较的方法就可以写一个比较器
class Manager extends Employee implements Comparable<Manager> {
@Override
public int compareTo(Manager otherManager) {
return (int) (this.getSalary() - otherManager.getSalary());
}
public static Comparator<Manager> managerComparator = new Comparator<Manager>() {
@Override
public int compare(Manager o1, Manager o2) {
return o1.compareTo(o2);
}
};
}
排序的时候只需要这样排序
Arrays.sort(managers, Manager.managerComparator);
1.2 接口与抽象类
使用抽象类表示通用属性存在一个严重的问题。每个类只能扩展一个类。假设 Employee 类已经扩展了另一个类,例如 Person,它就不能再扩展第二个类了
但是每个类可以实现多个接口
2 lambda 表达式
Java 8 提供了一种简洁而灵活的方式来表示匿名函数或闭包。Lambda 表达式可以用来替代使用匿名内部类的情况,使代码更加简洁和易读。
形式:
(parameters) -> expression
(parameters) -> { statements; }
2.1 函数接口
public class Lambda {
public static void main(String[] args) {
Sqrt sqrt = (x, y) -> {
int ans = 1;
for (int i = 0; i < y; i++) {
ans *= x;
}
return ans;
};
int ans = sqrt.getValue(3, 4);
System.out.println(ans); // print 81
}
interface Sqrt {
int getValue(int x, int y);
}
}
2.2 比较器
第5章的排序,可以写成 lambda 式
这样甚至不需要比较器
// Arrays.sort(managers, Manager.managerComparator);
Arrays.sort(managers,
(o1,o2)-> (int) (o1.getSalary()-o2.getSalary()));
2.3 遍历
使用 Lambda 表达式来遍历集合非常简洁和方便。在 Java 8 中,集合类(如 List、Set、Map)都提供了 forEach() 方法,该方法接受一个函数式接口 Consumer
的实现作为参数,用于对集合中的每个元素执行指定的操作
例:
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// 使用 Lambda 表达式遍历集合
fruits.forEach(fruit -> System.out.println(fruit));
2.4 方法引用
【注】:实在看不懂了,《Java核心技术》P247-P255,Lambda 表达式,以后再看
3 内部类
同上看不懂
4 代理
同上看不懂