目录
Lambda表达式
要想使用函数式编程:接口必须只有一个方法,如果存在两个以上的方法,无法使用函数式编程
interface Add{
void add(int x,int y);
}
public class Test{
public static void main(String[] args){
Add add = (x,y) -> System.out.println(x+y);
//Lambda表达式
Add add1 = (x,y) -> System.out.println(x+10+y);
add.add(10,5);
add1.add(15,10);
}
}
如果现在某个接口就是为了函数式编程而生的,在定义时只能存在一个方法,因此有一个新的注解@Funcationallnterface,次注解会检查该接口中是否只存在一个抽象方法,存在两个抽象方法以上编译报错。
@FunctionalInterface
interface IMessage{
void print();
}
语法:
-
方法体只有一行代码时
(方法参数) —> 具体的方法体实现
- 当方法有返回值时,单行代码的lambda表达式可以省略return语句
@FunctionalInterface
interface IMessage{
void print();
}
@FunctionalInterface
interface IAdd{
int add(int x,int y);
}
public class Test{
public static void main(String[] args) {
IMessage msg = () -> System.out.println("helloworld");
msg.print();
IAdd add = (p1,p2) -> p1+p2;
System.out.println(add.add(10,20));
}
}
- 当方法体有多行代码时
(方法参数)->{
....
....
...
[return 语句];
};
public class Test{
public static void main(String[] args) {
IAdd add = (p1,p2) ->{
int result = p1+p2;
result+=20;
return result;
};
System.out.println(add.add(10,20));
}
}
方法引用
——与Lambda表达式搭配使用
方法引用的四种形式:
- 引用类中静态方法
类名称 :: 静态方法名称
public class Test{
public static void main(String[] args) {
IUtil<Integer,String> util =
String :: valueOf;
//相当于调用String.valueOf(10);
String str = util.switchPara(10);
System.out.println(str.startsWith("1"));
}
}
- 引用某个对象的方法
实例化对象 :: 普通方法
public class Test{
public static void main(String[] args) {
IUtil<String> util =
"hello" :: toUpperCase;
//相当于调用了"hello".toUpperCase();
System.out.println(util.switchPara());
}
}
- 调用类中普通方法
类名称 :: 通方法名
public class Test{
public static void main(String[] args) {
IUtil<Integer,String> util =
String :: compareTo;
System.out.println(util.compare("刘","张"));
}
}
- 引用类中的构造方法
类名称 :: new
public class Test{
public static void main(String[] args) {
IUtil<Person,String,Integer> util =
Person::new;
System.out.println(util.createPer("张",10));
}
}