Java中的匿名函数(也称为匿名内部类或lambda表达式)是一种简洁的代码表达方式,它允许你定义一个没有名称的函数并将其传递给其他函数或方法。以下是一些使用匿名函数的好处:
- 简洁性:匿名函数能够以更简洁的方式编写代码,避免了创建完整的类或接口的冗长和繁琐。
- 减少代码重复:匿名函数可以重用,避免重复编写相同的代码块,提高了代码的复用性。
- 简化回调和事件处理:在需要传递回调函数或处理事件的场景中,匿名函数可以作为参数直接传递给其他方法,使得代码更加清晰易读。
- 提高可读性:对于某些复杂逻辑,使用匿名函数可以使代码更加简洁和易于理解。
- 减少类和接口的创建:通过使用匿名函数,可以减少创建额外的类或接口的需求,从而降低代码的复杂性。
- 支持多态性:匿名函数可以作为接口或抽象类的实现,支持多态性,使得代码更加灵活和可维护。
- 提高性能:在某些情况下,匿名函数可能比完整的类或接口实现更加高效,因为它们减少了类的创建和销毁开销。
总之,匿名函数在Java中提供了一种方便、灵活的代码表达方式,可以简化代码、提高可读性和性能,并减少不必要的类和接口的创建。
匿名函数的实现
1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口
//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口 interface ILike { void hit(long param); }
没有类名,必须借助接口或父类
通过实例化函数式接口就可以完成匿名内部类实现此接口并重写方法
interface ILike { void hit(long param); } @Test void testAnonymous() throws Exception { //匿名内部类,没有类名称,必须借助接口 ILike like = new ILike() { @Override public void hit(long param) { System.out.println("i like anonymous => " + param); } }; for (int i = 0; i < 10; i++) { like.hit(System.currentTimeMillis()); Thread.sleep(1000); } }
用 Lambda 简化匿名内部类的写法
匿名内部类是为了省去类名的写法
Lambda 简化写法不但可以省去类名,还可以省去接口名和函数名。因为只有一个抽象方法,可以直接实现并指向这个抽象方法和方法体
//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口 interface ILike { void hit(long param); } @Test void testLambda() throws Exception { // 用lambda简化,因为接口中只有一个函数,所以可以直接省略实例化的接口名和函数名 ILike like = (param) -> { System.out.println("i like lambda => " + param); }; for (int i = 0; i < 10; i++) { like.hit(System.currentTimeMillis()); Thread.sleep(1000); } }
interface PrintInfo { void print(String data); } static void printJob(PrintInfo printInfo, String data) { printInfo.print(data); } @Test void testLambda2() { printJob(new PrintInfo() { @Override public void print(String statement) { System.out.println("We're learning " + statement); } }, "Lambda"); }
interface PrintInfo { void print(String data); } static void printJob(PrintInfo printInfo, String data) { printInfo.print(data); } @Test void testLambda2() { printJob(statement -> System.out.println("We're learning " + statement), "Lambda"); }
结论
- 匿名函数写法和匿名类写法的前提必须基于函数式接口
- 匿名函数写法和匿名类写法其本质是同一个东西,只是简化写法不同
- 使用Lambda表达式简写匿名函数时,可以同时省略实现类名、函数名。除此外也可以使用传统写法