一篇带你学会匿名内部类+Lambda!!!
一、匿名内部类1.概念没有名字的局部内部类在仅使用一次方法时可以选择使用匿名内部类在创建对象时直接定义类体没有类名所以叫匿名内部类2.作用简化代码不用单独写一个类去实现接口 / 继承类3.使用前提可以是接口、抽象类、普通类不需要定义实现类直接当场重写方法4.标准语法new表示创建对象匿名内部类就是边定义类边new对象new 类名/接口名() { // 重写方法 Override 方法返回值 方法名(参数) { 方法体; } };5.例子这里用一下上一篇提到的comparator排序Integer[] arr {3,1,5,2,4}; // 匿名内部类写法 Arrays.sort(arr, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o1 - o2; // 升序 } });二、Lambda表达式1.概念是函数式编程的体现而函数式编程是什么呢我们先说一下面向对象用对象封装数据与行为关注谁去做而函数式编程用函数处理数据忽略面向对象的复杂语法强调做什么而不是谁去做更加关注方法的逻辑2.作用简化函数式接口的匿名内部类的写法让代码更加简洁、灵活实现代码作为参数传递的效果3.使用前提必须是接口的匿名内部类不能用于类、抽象类必须是函数式接口有且仅有一个抽象方法的接口接口上方可添加FunctionalInterface注解编译器会强制校验避免多写抽象方法4.标准语法(参数列表) - { 方法体 }5.显示实现类 vs 匿名内部类 vs Lambda通过代码来明显看出三者区别// 函数式接口 FunctionalInterface interface Swim { void swimming(); } // 显式实现类 class SwimImpl implements Swim { Override public void swimming() { System.out.println(正在游泳~~~); } } public class LambdaDemo { public static void method(Swim s) { s.swimming(); } public static void main(String[] args) { // 显示实现类创建对象传入方法 Swim s new SwimImpl(); method(s); // 匿名内部类不定义类名 method(new Swim() { Override public void swimming() { System.out.println(正在游泳~~~); } }); // Lambda表达式 // 标准Lambda method(() - { System.out.println(正在游泳~~~); }); // 单行代码极简Lambda method(() - System.out.println(正在游泳~~~)); } }6.例子还是用上一篇提到的comparator排序Integer[] arr {3,1,5,2,4}; // 匿名内部类 Arrays.sort(arr, new ComparatorInteger() { Override public int compare(Integer a, Integer b) { return a - b; } }); // Lambda Arrays.sort(arr, (a, b) - a - b);三、总结不能直接说Lambda是匿名内部类的简写而是函数式接口的匿名内部类的简写是函数式接口的新实现方式之后在有些地方可能会用到比如maven等因此我们要搞懂匿名内部类和Lambda两者的关系以及区别和使用