对接口的新理解

好久没打开博客了,以后打算用起来。我今天又对接口有了新理解。

接口定义了做什么,实现类实现怎么做。粘合剂是向上造型。在源码里,很多方法的参数定义都是接口,例如:

集合工具类:

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速入门简介


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值