万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!

所谓委托,主要指函数声明的一种方式。通常在函数作为参数时使用。

Java中现成的委托,语法还是比较啰嗦的。

image

可以看到,对不同个数的参数和返回值,有不同的写法。(上图中Consumer和Supplier的接口名称部分,少了对泛型的描述。使用时应自己补上。)

 我们这里举个例子:

 1 import java.util.function.BiFunction;
 2 
 3 public class App
 4 {
 5     public static void main(String[] args) throws Exception
 6     {
 7         test(1,2,App::add);
 8         test(9,3,App::sub);
 9     }
10     public static int add(int a,int b) {
11         return a + b;
12     }
13     public static int sub(int a,int b) {
14         return a - b;
15     }
16     public static void test(int x,int y,BiFunction<Integer,Integer,Integer> f)
17     {
18         System.out.println(f.apply(x,y));
19     }
20 }

说明:函数test可以接受形如”int f(int x,int y)“的函数,作为参数。在内部运行它。

运行结果:3(换行)6


 有时候没有现成的函数,需要临时随手写一个。就出现了拉姆达表达式和拉姆达语句。

拉姆达=lambda

要点:

1、拉姆达系列,其实就是匿名函数(没有名字的函数)。当需要函数做参数,该函数又不会在其他地方被调用的时候,就不用费心去给函数起名字。

2、拉姆达用关键字“->”来连接参数和函数体。

3、如果函数本身只有一条return语句,就可以省略花括号和“return”,以及后面的分号,这是拉姆达表达式。

4、多语句,则带上花括号和里面的一切,这是拉姆达语句。

例如,我想用上例中的test计算3*5,再计算4+5+6+...+17,可以这样写:

 1 import java.util.function.BiFunction;
 2 
 3 public class App
 4 {
 5     public static void main(String[] args) throws Exception
 6     {
 7         //lambda 表达式
 8         test(3, 5, (x, y) -> 3 * 5);
 9         //lambda 语句(块)
10         test(4, 17, (x, y) ->
11         {
12             int s = 0;
13             for (int i = x; i <= y; i++)
14             {
15                 s += i;
16             }
17             return s;
18         });
19     }
20 
21     public static void test(int x, int y, BiFunction<Integer, Integer, Integer> f)
22     {
23         System.out.println(f.apply(x, y));
24     }
25 }

 结果略。

 


java也支持自定义委托类型,你得把要传入的任意函数声明,写成一个“函数接口”。

多了几行简单的代码,省略了泛型的使用。

麻烦了还是简化了?自己判断一下吧。

 1 // 定义一个函数式接口
 2 @FunctionalInterface
 3 interface 我的函数
 4 {
 5     // 只有一个抽象方法
 6     int 调用(int a, int b);
 7 }
 8 
 9 public class App
10 {
11     public static void main(String[] args)
12     {
13         int a = 10;
14         int b = 5;
15 
16         // 方式1: 使用lambda表达式实现加法
17         test(a, b, (x, y) -> x + y);
18 
19         // 方式2: 使用方法引用实现加法
20         test(a, b, App::add);
21 
22     }
23 
24     // 定义一个接受函数式接口作为参数的方法
25     public static void test(int x, int y, 我的函数 f)
26     {
27         int z = f.调用(x, y);
28         System.out.println("计算结果: " + z);
29     }
30 
31     // 定义一些静态方法,用于方法引用
32     public static int add(int a, int b)
33     {
34         return a + b;
35     }
36 }

说明:

1、17行和20行的方法,都可以作为参数,被第25行的函数接口参数f接受。即:赋值“函数”->“函数接口”是正确的。

2、第2行的注解,是确保接口内只有一个抽象函数(即:调用),否则会报错。

3、为了增强可读性,很多命名采用中文。实际使用中大家灵活处理。

 

posted on 2025-11-04 13:28  万金流  阅读(84)  评论(0)    收藏  举报