好久没打开博客了,以后打算用起来。我今天又对接口有了新理解。
集合工具类:
public class Collections {
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
}
比较器:
public interface Comparator<T> {
int compare(T o1, T o2);
}
在代码中的用法:
@Data
@Builder
public class Man {
private String name;
private int age;
private double salary;
}
@Test
public void test() {
Man zs = Man.builder().name("zs").age(20).salary(6000).build();
Man ls = Man.builder().name("ls").age(30).salary(16000).build();
Man ww = Man.builder().name("ww").age(40).salary(36000).build();
List<Man> men = Arrays.asList(ls, zs, ww); //乱序
Collections.sort(men, new Comparator<Man>() { //这里new了一个实例,还重写了compare方法
@Override
public int compare(Man o1, Man o2) {
if (o1.getSalary() > o2.getSalary()) {
return 1;
} else if (o1.getSalary() < o2.getSalary()) {
return -1;
} else {
return 0;
}
}
});
System.out.println(men);
}
执行结果:
[Man(name=zs, age=20, salary=6000.0),
Man(name=ls, age=30, salary=16000.0),
Man(name=ww, age=40, salary=36000.0)]
在上述例子中,就是用一个匿名内部类(相当于Comparator的实现类)去new的对象。这里就用到了用接口接收实现类的,就有如平时最常见的:
@Autowired
private XxxService xxxService; //其实是实例化XxxServiceImpl
总结:定义了接口里面的方法后,方法的功能(目的)就存在了。即使可以不先写实现,也可以写后面的代码。而且接口的扩展性很好。
之前代码的λ表达式(Lambda)表达式版本(从Java 8之后)
@Test
public void test2() {
Man zs = Man.builder().name("zs").age(20).salary(6000).build();
Man ls = Man.builder().name("ls").age(30).salary(16000).build();
Man ww = Man.builder().name("ww").age(40).salary(36000).build();
List<Man> men = Arrays.asList(ls, zs, ww);
Collections.sort(men, (m1, m2) -> {
if (m1.getSalary() > m2.getSalary()) {
return 1;
} else if (m1.getSalary() < m2.getSalary()) {
return -1;
} else {
return 0;
}
});
System.out.println(men);
}
λ表达式:将一段代码赋值给一个变量,这个表达式就是λ表达式。
详情参考:Lambda速入门简介