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