一、java1.8的接口变化,更加接近c++的多继承。在java1.8之前,interface接口里面是只能有抽象方法和常量,不能有任何方法的实现的,那么在jdk1.8里面打破了这个规定,引入了新的关键字default,通过使用default修饰方法,可以让我们在接口里面定义具体的方法实现,也可以有static修饰的实现方法。
看具体的例子,定义两个接口:
public interface IFood {
void eatDinner(IFoodTime foodTime);
default void feedPet(){
System.out.println("记得给小泰迪吃晚餐");
}
static void feedFood(){
System.out.println("小泰迪晚上要吃肉");
}
}
public interface IFruit {
void dessert();
default void feedPet(){
System.out.println("小泰迪不喜欢吃水果");
}
static void feedFood(){
System.out.println("小泰迪晚晚餐不需要甜点");
}
}
public interface IFoodTime {
int getFoodTime();
}
两个接口实现类:如果一个实现类同时实现IFruit 、IFood接口,两个接口都有default修饰的同名方法 feedPet(),那么实现类在重写方法的时候,是重写的哪一个接口的呢?这里不需要担心,具体的实现只需要根据自己业务的需要使用具体接口灵活使用
public class FoodFruit implements IFood,IFruit {
@Override
public void eatDinner(IFoodTime foodTime) {
System.out.println("晚餐"+foodTime.getFoodTime()+"点吃土豆炖牛肉");
}
@Override
public void dessert() {
System.out.println("饭后甜点吃点啥呢?葡萄还是草莓");
}
@Override
public void feedPet() {
IFood.feedFood();
}
}
测试类:
public static void main(String[] args){
FoodFruit foodFruit=new FoodFruit();
///使用lamda表达式
foodFruit.eatDinner(() -> 7);
foodFruit.dessert();
foodFruit.feedPet();
}
晚餐7点吃土豆炖牛肉
饭后甜点吃点啥呢?葡萄还是草莓
小泰迪晚上要吃肉
二、 关于函数式编程的一些应用
可以是使用供给型函数和消费型函数实现if...else逻辑操作
定义一个函数式接口
@FunctionalInterface
public interface OkExceptionFunction{
///使用函数式编程
/**
* 处理正常或异常业务
* @param consumer 操作异常业务逻辑
* @param runnable 操作正常业务逻辑
*/
void handlerErrorAndOkAction(Consumer<String> consumer,Runnable runnable);
}
定义一个通用的公用类,实现OkExceptionFunction的方法的具体逻辑
public static class CommonAction{
/**
* @param b 逻辑分支控制
* @param msg 消息提示
* @return
*/
public static OkExceptionFunction doOkElseDoError(boolean b,String msg){
return (c, runnable) -> {
if(b){
c.accept(msg);
}else {
runnable.run();
}
};
}
}
具体代买逻辑中代用
CommonAction.doOkElseDoError(false,"msg").handlerErrorAndOkAction(s -> {
throw new RuntimeException("执行异常:"+s);
}, () -> {
System.out.println("正常执行业务逻辑");
});