UM2L17——方法的引用和Function接口
UM2L17——方法的引用和Function接口
方法的引用
使用函数式接口去装载我们在类中声明的方法,而不是lambda表达式
不管是使用lambda表达式还是想要引用方法,我们都需要使用函数式接口来装载
除了Function
以外Java中还写好了很多函数式接口供我们使用,用现成的还是自己写,自己决定即可
如何进行方法的引用
-
引用静态方法
类名::静态方法名
1
2
3
4
5
6
7
8
9
10
11
12
13
14interface ITest01 {
void fun();
}
public class Lesson22 {
public static void Test() {
System.out.println("方法调用");
}
public static void main(String[] args) {
ITest01 t = Lesson22::Test;
t.fun();
}
}输出:
1
方法调用
-
引用成员方法
对象名::成员方法名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15interface ITest01 {
void fun();
}
public class Lesson22 {
public void Test2() {
System.out.println("方法调用2");
}
public static void main(String[] args) {
Lesson22 l = new Lesson22();
ITest01 t2 = l::Test2;
t2.fun();
}
}输出:
1
方法调用2
-
引用构造函数
-
无参和有参构造
类名::new
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25interface ITest02 {
Lesson22 fun();
}
interface ITest03 {
Lesson22 fun(int a);
}
public class Lesson22 {
public Lesson22() {
System.out.println("无参构造");
}
public Lesson22(int i) {
System.out.println("有参构造" + i);
}
public static void main(String[] args) {
ITest02 tt2 = Lesson22::new;
Lesson22 l2 = tt2.fun();
ITest03 tt3 = Lesson22::new;
Lesson22 l3 = tt3.fun(99);
}
}输出:
1
2无参构造
有参构造99 -
数组构造
类名[]::new
对于数组的构造,参数要传入的是数组的长度
1
2
3
4
5
6
7
8
9
10
11interface ITest04 {
Integer[] fun(int n);
}
public class Lesson22 {
public static void main(String[] args) {
ITest04 tt4 = Integer[]::new;
Integer[] arr = tt4.fun(9);
System.out.println(arr.length);
}
}输出:
1
9
-
-
引用泛型方法
函数式接口的泛型和对应的泛型方法 参数或返回值上一定要对应1
2
3
4
5
6
7
8
9
10
11
12
13
14interface ITest05<T> {
void fun(T i);
}
public class Lesson22 {
static public<T> void Test3(T i) {
System.out.println(i);
}
public static void main(String[] args) {
ITest05<Integer> ttt = Lesson22::Test3;
ttt.fun(999);
}
}输出:
1
999
Function接口
我们在使用lambda表达式时都需要自己声明函数式接口用于装载
为了方便我们的使用,Java在java.util.function
包中提供了预先定义好的函数式接口供我们使用
其中最常用的接口是 Function<T, R>
接口
T
:参数类型
R
:返回值类型
调用方法:apply()
注意:更多的写好的函数式接口 可以直接去function
包中查看
如果不想记忆,那直接自己写函数式接口即可
1 | Function<Integer, String> function = (i) -> { |
输出:
1 | 100 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!