Java基础25--自定义函数式接口及Lambda表达式的代码是怎样运行的

    科技2025-09-22  67

    Java基础25–自定义函数式接口及Lambda表达式的代码是怎样运行的

    自定义函数式接口

    自定义函数式接口: 1、声明一个接口,只能包含一个抽象方法 2、给这个接口加@FunctionalInterface

    例1:

    //1、定义一个函数式接口IntCalc,其中抽象方法int cal(int a , int b),使用注解@FunctionalInterface @FunctionalInterface interface IntCalc{ int cal(int a , int b); } //2、在测试类中定义public static void getProduct(int a , int b ,IntCalc tools), //该方法的预期行为打印使用tools的cal(a,b)的计算结果 public static void getProduct(int a , int b ,IntCalc tools){ int result = tools.cal(a, b); //没有说明算什么,是和还是差等 System.out.println("结果:" + result); } public class TestDefineFunctionalInterface { public static void main(String[] args) { //IntCalc tools形参,函数式接口,可以Lambda表达式赋值 /* * (1)抽象方法:int cal(int a , int b); * (2)如何实现抽象方法 * 例如:求a+b的和 */ getProduct(1,2, (int a , int b) -> {return a+b;});//new了一个IntCalc的实现类的对象,而且实现了IntCalc抽象方法 //例如:求a*b的和并优化 getProduct(1,2, (a ,b) ->a*b); }

    怎么运行的:主方法运行,先主方法里调用getProduct方法,到public static void getProduct方法,然后对应参数赋值 整个(int a , int b) -> {return a+b;}其实new了一个IntCalc接口的实现类的对象,而且实现了IntCalc抽象方法,然后将对象赋值给了IntCalc tools,tools调用 tools.cal(a, b)方法执行的是实现类重写的方法,即return a+b;

    a,b传值过程 例2:

    public class TestConsumer { @Test public void test01(){ List<Integer> list = Arrays.asList(1,2,3,4,5); /* * default void forEach(Consumer<? super T> action) * 形参的类型是Consumer接口,可以使用Lambda表达式赋值 * Consumer<T> void accept(T t) * */ list.forEach(num -> System.out.println(num)); } /* *default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } */ }

    System.out.println(num)这句代码传给了action调用的方法体,相当于代替action.accept(t);num传给了T t

    Processed: 0.017, SQL: 8