目录
2.使用@FunctionalInterface注解标记该接口为函数接口
Lambda 表达式是 Java 8 引入的一种新的语法特性,它可以使得代码更加简洁、易读,并且支持函数式编程。Lambda 表达式实际上就是一个匿名方法,它可以作为参数传递给方法或者存储在变量中。
Lambda 表达式由参数列表、箭头符号和函数体组成。
(参数列表) -> 函数体
Lambda 表达式可以有零个或多个参数。如果没有参数,可以使用空括号表示 ()
;如果只有一个参数,可以省略括号;如果有多个参数,需要使用逗号将它们分隔开。
() -> System.out.println("Hello")
x -> x * x
(x, y) -> x + y
Lambda 表达式的函数体可以是一个表达式,也可以是一个语句块。如果函数体只有一条表达式,可以直接写在箭头后面;如果函数体包含多条语句,需要使用大括号 {}
将它们括起来,并使用分号 ;
分隔。
x -> x * x
(x, y) -> { int sum = x + y; System.out.println(sum); }
类型推断:Lambda 表达式中的参数类型可以根据上下文进行推断,不需要显式地指定类型。编译器会根据参数的使用情况来确定参数的类型。
(x, y) -> x + y
Lambda 表达式只能用于函数式接口,即只包含一个抽象方法的接口。在使用 Lambda 表达式时,需要根据函数式接口的抽象方法定义来确定参数列表和返回值类型
定义一个函数接口需要满足以下两点:
@FunctionalInterface
public interface MyInterfaceByJava8 {
void add();//只能存在一个抽象方法
}
首先定义一个函数接口
@FunctionalInterface
public interface FuncInterface {
void add();
}
接着实现并调用这个无参函数,这里展示传统的匿名内部类调用法,跟Lambda调用法。
public static void main(String [] args){
//使用匿名内部类调用
new FuncInterface(){
@Override
public void add() {
System.out.println("匿名内部类实现调用");
}
}.add();
//使用Lambda调用
((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();
}
可以看到使用Lambda代码更加简洁优雅
定义函数接口
@FunctionalInterface
public interface FuncInterface2 {
int del(int id);
}
实现并调用
public static void main(String [] args){
int id=101;
//使用匿名内部类调用
int result1=new FuncInterface2(){
@Override
public int del(int id) {
System.out.println("匿名内部类实现调用:"+id);
return 1;
}
}.del(id);
//使用Lambda调用
int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
System.out.println(result1);
System.out.println(result2);
}
当函数参数仅有一个时可以省略括号(没有参数时必须用空括号,不能省)
//普通写法
int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
//精简写法--省略参数园括号
int result2=((FuncInterface2)p->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
当函数体只有一条语句可以省略{}
//普通写法
((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();
//精简写法--省略函数体括号
((FuncInterface)()->System.out.println("Lambda实现调用")).add();
当函数体仅有一条语句且是返回语句时,可以省略return
//普通写法
int result2=((FuncInterface2)p->return 1).del(id);
//精简写法--省略return
int result2=((FuncInterface2)p->1).del(id);
public static void main(String [] args){
List<String> names=Arrays.asList("小明","小黑","小红");
//传统遍历--增强for
for(String name:names){
System.out.println(name);
}
//传统遍历--匿名内部类
names.forEach(new Consumer<String>(){
@Override
public void accept(String name) {
System.out.println(name);
}
});
//Lambda表达式遍历
names.forEach(name->System.out.println(name));
}
将学生集合的学生按照年龄排序
public static void main(String [] args){
List<Student> students1=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
List<Student> students2=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
//传统排序--匿名内部类
students1.sort(new Comparator<Student>(){
@Override
public int compare(Student stu1, Student stu2) {
return stu1.getAge()- stu2.getAge();
}});
//Lambda
students2.sort((stu1,stu2)->stu1.getAge()-stu2.getAge());//省略return
System.out.println(students1);
System.out.println(students2);
}
public static void main(String [] args){
//传统调用
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("子线程运行了");
}
}).start();
//Lambda
new Thread(()->System.out.println("子线程运行了")).start();
}