判断:可以用@FunctionInterface来判断一个接口是否是函数接口
java内置四大函数式接口接口名—方法
Supplier—get
Consumer—accept
Predicate—test
Function—apply
名字起的很形象了
语法
- 1.只有一条语句,省略大括号,如果语句是return,省略return.
- 2.如果只有一个参数,省略小括号.
- 一般形式 (参数列表)->(方法体)
@Test
void Test1(){
// 未使用lambda
Comparable a = new Comparable<>() {
@Override
public int compareTo(Integer o) {
return 0;
}
};
}
@Test
void Test2() {
// 一般lambda
Comparable b = (o) -> {
return 0;
};
}
@Test
void Test3(){
// 只有一条语句,省略大括号,如果语句是return,省略return. 使用lambda
Comparable c = (o)->0;
}
方法引用
本质上是lambda
- 写法
- 类::静态方法
- 实例::非静态方法
- 类::非静态方法
- 条件
- a.当函数接口中那个抽象方法A只有一条语句
- b. 那条语句调用了方法B
- c.
- 适用于 类::静态方法/实例::非静态方法A与B的参数列表和返回值相同
- 适用于 类::非静态方法 A的参数列表中第一个参数是实例且可以调用B方法,后面的参数与B方法的参数列表对应。返回值相同
// 方法引用 类::静态 有返回值
@Test
void Test4(){
// 不使用方法引用
Function func1 = new Function<>() {
@Override
public String apply(Integer integer) {
return String.valueOf(integer);
}
};
// 使用方法引用
Function func2 = String::valueOf;
}
// 方法引用 类::非静态, 无返回值
@Test
void Test5(){
// 不使用方法引用
Consumer con1 = new Consumer() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
// 使用方法引用
Consumer con2 = System.out::println;
}
构造器引用和数组引用
写法 ClassName::new
条件
- 只有一条语句,且为return
- 有抽象方法和对应的构造器形参列表相同
// 构造器引用
@Test
void Test6(){
// 未使用构造引用
Supplier


