JDK8怎么实现一个接口
1、首先我们来举一稍僚敉视个接口在实际中应用的案例,例如有一个员工集合,我们想按照员工的年龄或者工资进行筛选,首先想到的是可以用for循环去遍历,然后分别比较每一个员工的具体某一项数据,这样的方式非常不灵活,也不推荐,代码如下,我们创建一个雇员实体类,并且生成该类的有参构造、getter/setter方法、toString()方法等,然后写一个按照年龄过滤雇员的方法,并且在测试方法中调用。若想实现按照工资过滤则又需要另外的方法,因此我们想到了用接口去实现。
2、如果我们不仅需要按照年龄过滤员工信息,还想按照工资去过滤员工信息,我们想到了使用接口来实现,在接口中创建一个抽象方法,该方法在接口中没有具体的实现,我们根据需求写不同的类去实现接口进而实现不同的过滤功能。我们创建一个接口MyPredicate,该接口中用到了泛型T,并且这个接口有一个抽象方法test返回boolean类型。@FunctionalInterface注解是用来声明函数式接口的,我们可以先放着,暂时用不上。
3、接下来我们创建一个实现类FilterEmployeeByAge,这个实现类中重写test方法,按照年龄去过滤。然后我们写一个统一的filterEmployee方法,该方法中的传参是集合list和MyPredicate接口类型,并且过滤调用test方法,并不涉及到具体的实现类。然后我们在测试方法中调用filterEmployee方法,并且创建一个FilterEmployeeByAge对象进行传参。这样JDK8中实现接口的方法我们便讲完了,可以看出使用接口比步骤1写法好处在于我们只需要写一个方法,仅在调用处使用不同的对象即可。按照工资去过滤年龄需要创建一个FilterEmployeeBySalary类并且实现MyPredicate接口类型,写法相同不再赘述了,直接在测试类中调用filterEmployee方法时传参改为FilterEmployeeBySalary的对象即可。
4、接口的使用我们还有优化的方法,那就是可以不用创建FilterEmployeeByAge类和FilterEmployeeBySalary类,我们直接使用MyPredicate接口创建匿名内部类即可,这样也节省了类文件。filterEmployee方法同步骤3不需要做任何修改,匿名内部类的写法如下,只需要在调用处修改test方法的实现就可以按照不同的条件进行过滤了,这也是JDK8之前实现接口非常简单的方式。
5、当然实现接口还有JDK8中特有的lamb蟠校盯昂da表达式的方式,这时候@FunctionalInterface注鞅瓞慈玢解声明函数式接口便起作用了,JDK8特有的接口实现方式如下图所示,filterEmployee依旧为步骤3中的方法不变,传参中的(e) -> e.getAge() >24便是函数。我们可以看出JDK8中的lamda表达式清晰简洁,减少了许多模板代码的使用,也是非常推荐的一种写法,甚至在lambda表达式的使用中,MyPredicate接口也是可以省了,因为JDK8已经帮我们创建好了。
6、JDK8中接口除了抽象方法之外,还有默认方法用default修饰的,静态方法用static修饰的,在以往的JDK版本中是不存在的,这两种方法写法如下图所示。
7、接口中的default方法和静态方法有方法体的实现,default方法我们可以使用类去实现接口,静态方法可以直接使用接口名.方法名去调用。我们创建一个SubClass类,实现MyFun, MyInterface这两个接口,在类中重写getName()方法,由于两个接口中有相同的方法,那么在重新的时候我们可以指定使用哪一个方法。在调用时我们使用类中重写的方法,并且使用接口名.方法名去调用接口中的静态方法,代码及执行结果如下图所示。