什么是Lambda表达式
Lambda 表达式是 Java 8 引入的一种新的语法特性,它可以使得代码更加简洁、易读,并且支持函数式编程。Lambda 表达式实际上就是一个匿名方法,它可以作为参数传递给方法或者存储在变量中。
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 表达式时,需要根据函数式接口的抽象方法定义来确定参数列表和返回值类型
如何定义函数接口
定义一个函数接口需要满足以下两点:
1.保证接口中只能有一个抽象方法
2.使用@FunctionalInterface注解标记该接口为函数接口
@FunctionalInterface public interface MyInterfaceByJava8 { void add();//只能存在一个抽象方法 }
使用Lambda调用无参函数
首先定义一个函数接口
@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代码更加简洁优雅
使用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); }
使用Lambda的精简写法
当函数参数仅有一个时可以省略括号(没有参数时必须用空括号,不能省)
//普通写法 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);
使用Lambda实现集合遍历
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)); }
使用Lambda实现集合排序
将学生集合的学生按照年龄排序
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); }
使用Lambda实现线程调用
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(); }