Java 匿名函数的概念和写法

发布时间 2023-10-31 17:12:18作者: VipSoft

匿名函数的实现
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表达式简写匿名函数时,可以同时省略实现类名、函数名。除此外也可以使用传统写法

源码:https://gitee.com/VipSoft/VipBoot/blob/develop/vipsoft-demo/src/test/java/com/vipsoft/demo/AnonymousFunction.java