Lambda表达式是基于数学中的λ演算而得名,直接对应于其中的Lambda抽象。Lambda表达式是Java8中重要的新特性,支持将代码作为方法参数,允许使用更加简洁的代码来创建只有一个抽象方法的接口实例。
Lambda规范
普通方法的定义
返回类型 方法(参数列表){
方法体
}
Lambda表达式(匿名方法)
(参数列表) -> {方法体}
Lambda表达式实际上是一个匿名方法,即没有方法名。表达式通常由参数列表、箭头和方法体组成
- 参数列表允许省略形参的类型。如果只包含一个推断类型参数时,还可以省略小括号()
- ->由英文的连字符(-)和大于号(>)组合,是Lambda运算符
- 方法体可以是单一的表达式或多条语句组成的语句块。如果只有一条语句,则允许省略方法体的{};如果只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,如果方法体中仅有一条省略了return关键字的语句,则Lambda表达式会自动返回该条语句的结果值。
【示例】多参数、多语句的Lambda表达式
(int x,int y) -> {
System.out.println(x);
System.out.println(y);
return x + y;
}
【示例】省略参数类型的Lambda表达式
(x,y) -> {
System.out.println(x);
System.out.println(y);
return x + y;
}
【示例】省略{}和return关键字的Lambda表达式
(x,y) -> x + y
【示例】省略()、{}和return关键字的Lambda表达式
x -> ++x
【示例】没有参数的Lambda表达式
//没有参数,返回5
() -> 5
//没有参数,只打印信息
() -> System.out.println("你好");
Lambda应用
1.使用Lambda表达式输出集合内容
import java.util.Arrays;
import java.util.List;
public class LambdaDemo{
public static void main(String []args){
String[] names = {"test1","test2","test3"};
List<String> arrNames = Arrays.asList(names);
//传统的循环方式
for(String name : arrNames){
System.out.println(name);
}
//在Java8中使用Lambda表达式输出
arrNames.forEach((name) -> System.out.println(name));
//这里的name只是一个形式参数,name改为x也是一样运行的
//在Java8中使用双冒号操作::
arrNames.forEach(System.out::println);
}
}
2.使用Lambda表达式实现排序
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaDemo2{
public static void main(String[] args){
List<String> arrNames1 = Arrays.asList("test1","test2","test3");
//重写Comparator接口中的compare()方法实现排序
Collections.sort(arrNames1,new Comparator<String>(){
@Override
public int compare(String a,String b){
return b.compareTo(a);
}
});
//使用Lambda表达式遍历输出
arrNames1.forEach((x) -> System.out.println(x));
List<String> arrNames2 = Arrays.asList("test1","test2","test3");
//使用Lambda表达式简化方法的重写
Collections.sort(arrNames2,(a,b) -> b.compareTo(a));
arrNames2.forEach((x) -> System.out.println(x));
}
}
3.使用Lambda表达式实现监听器
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class LambdaDemo3 extends JFrame{
JPanel p;
JTextArea ta;
JButton btn1,btn2;
public LambdaDemo3(){
super("Lambdaces测试");
p = new JPanel();
ta = new JTextArea();
btn1 = new JButton("传统方式");
btn2 = new JButton("Lambda方式");
//添加监听器
btn1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ta.append("你单击了按钮1\n");
}
});
//Lambda表达式
btn2.addActionListener(e -> ta.append("单击了按钮2\n"));
this.add(ta);
p.add(btn1);
p.add(btn2);
this.add(p,BorderLayout.SOUTH);
this.setSize(400,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new LambdaDemo3().setVisible(true);
}
}