Lambda 表达式是 Java SE 8 中包含的 Java 的一项新的重要功能。它提供了一种简洁清晰的方式来使用表达式表示方法接口。在收藏库中非常有用。它有助于迭代、过滤和从集合中提取数据。
Lambda 表达式用于提供具有函数式接口的接口的实现。它节省了大量的代码。如果使用 lambda 表达式,我们不需要再次定义提供实现的方法。这里我们只写实现代码。
Java lambda 表达式被视为函数,因此编译器不会创建 .class 文件。
Lambda 表达式提供函数式接口的实现。只有一个抽象方法的接口称为函数式接口。 Java 提供了@FunctionalInterface 注解来将接口声明为函数式接口。
(参数列表)-> {body}
Java lambda 表达式由三个部分组成。
1) 参数列表:也可以为空或非空。
2)箭头标记:用于链接参数列表和表达式主体。
3)主体:包含lambda表达式的表达式和语句。
无参数语法
() -> {
//无参数lambda的主体
}
单参数语法
(p1) -> {
//单参数lambda的主体
}
双参数语法
(p1,p2) -> {
//多参数lambda的主体
}
让我们看看没有实现 Java lambda 表达式的情况。这里我们不使用 lambda 表达式来实现一个接口。
可绘制界面{
公共无效绘制();
}
公共类 LambdaExpressionExample {
公共静态无效主(字符串[] args){
整数宽度=10;
//没有lambda,使用匿名类的Drawable实现
可绘制 d=new 可绘制(){
public void draw(){System.out.println("绘图"+width);}
};
d.绘制();
}
}
输出:
图10
现在,我们将借助Java lambda表达式来实现上面的示例。
@FunctionalInterface //可选
可绘制界面{
公共无效绘制();
}
公共类 LambdaExpressionExample2 {
公共静态无效主(字符串[] args){
整数宽度=10;
//与拉姆达
可绘制 d2=()->{
System.out.println("绘图"+width);
};
d2.draw();
}
}
输出:
图10
Lambda 表达式可以有零个或任意数量的参数。让我们看一个例子:
界面可说{
公共字符串说();
}公共类 LambdaExpressionExample3{
公共静态无效主(字符串[] args){
可说 s=()->{
return "我无话可说。";
};
System.out.println(s.say());
}
}
输出:
我无话可说。
界面可说{
公共字符串说(字符串名称);
}
公共类 LambdaExpressionExample4{
公共静态无效主(字符串[] args){
// 带有单个参数的 Lambda 表达式。
可说 s1=(名称)->{
返回“你好,”+姓名;
};
System.out.println(s1.say("Sonoo"));
// 可以省略函数括号
可说 s2= 名称 ->{
返回“你好,”+姓名;
};
System.out.println(s2.say("Sonoo"));
}
}
输出:
你好,园野
你好,索努
接口可添加{
int add(int a,int b);
}
公共类 LambdaExpressionExample5{
公共静态无效主(字符串[] args){// lambda 表达式中的多个参数
可添加 ad1=(a,b)->(a+b);
System.out.println(ad1.add(10,20));
// lambda 表达式中具有数据类型的多个参数
可加 ad2=(int a,int b)->(a+b);
System.out.println(ad2.add(100,200));
}
}
输出:
30
300
在Java lambda表达式中,如果只有一条语句,可以使用return关键字,也可以不使用return关键字。当 lambda 表达式包含多个语句时,必须使用 return 关键字。
接口可添加{
int add(int a,int b);
}
公共类 LambdaExpressionExample6 {
公共静态无效主(字符串[] args){
// 不带 return 关键字的 Lambda 表达式。
可添加 ad1=(a,b)->(a+b);
System.out.println(ad1.add(10,20));
// 带有 return 关键字的 Lambda 表达式。
可添加 ad2=(int a,int b)->{
返回(a+b);
};
System.out.println(ad2.add(100,200));
}
}
输出:
30
300
导入java.util.*;公共类 LambdaExpressionExample7{
公共静态无效主(字符串[] args){
List list=new ArrayList();
列表.add(“ankit”);
list.add("mayank");
list.add("irfan");
列表.add(“jai”);
列表.forEach(
(n)->System.out.println(n)
);
}
}
输出:
套件
玛雅克
伊凡
贾伊
@FunctionalInterface
接口可说{
字符串说(字符串消息);
}
公共类 LambdaExpressionExample8{
公共静态无效主(字符串[] args){
// 可以在 lambda 表达式中传递多个语句
可说的人 = (消息)-> {
String str1 = "我想说,";
字符串 str2 = str1 + 消息;
返回str2;
};
System.out.println(person.say("时间很宝贵。"));
}
}
输出:
我想说,时间很宝贵。
您可以使用 lambda 表达式来运行线程。在以下示例中,我们通过使用 lambda 表达式实现运行方法。
公共类 LambdaExpressionExample9{
公共静态无效主(字符串[] args){
//没有 lambda 的线程示例
可运行 r1=new 可运行(){
公共无效运行(){
System.out.println("线程1正在运行...");
}
};
线程 t1=新线程(r1);
t1.start();
//带有 lambda 的线程示例
可运行 r2=()->{
System.out.println("线程2正在运行...");
};
线程 t2=新线程(r2);
t2.start();
}
}
输出:
线程1正在运行...
线程2正在运行...
Java lambda 表达式可以在集合框架中使用。它提供了高效、简洁的方法来迭代、过滤和获取数据。以下是一些 lambda 表达式和示例。
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
产品类{
整数ID;
字符串名称;
浮动价格;
公共产品(int id,字符串名称,浮动价格){
极好的();
这个.id = id;
www.sychzs.cn = 名称;
这个.价格 = 价格;
}
}
公共类 LambdaExpressionExample10{
公共静态无效主(字符串[] args){List list=new ArrayList();
//添加产品
list.add(新产品(1,"惠普笔记本电脑",25000f));
list.add(新产品(3,"键盘",300f));
list.add(new Product(2,"戴尔鼠标",150f));
System.out.println("根据名称排序...");
// 实现 lambda 表达式
Collections.sort(列表,(p1,p2)->{
return p1.name.compareTo(www.sychzs.cn);
});
for(产品 p:列表){
System.out.println(www.sychzs.cn+" "+www.sychzs.cn+" "+p.price);
}
}
}
输出:
按名称排序...
2 戴尔鼠标 150.0
1 惠普笔记本电脑 25000.0
3 键盘 300.0
导入java.util.ArrayList;
导入java.util.List;
导入 www.sychzs.cn;
产品类{
整数ID;
字符串名称;
浮动价格;
公共产品(int id,字符串名称,浮动价格){
极好的();
这个.id = id;
www.sychzs.cn = 名称;
这个.价格 = 价格;
}
}
公共类 LambdaExpressionExample11{公共静态无效主(字符串[] args){
List list=new ArrayList();
list.add(新产品(1,"三星 A5",17000f));
list.add(新产品(3,"iPhone 6S",65000f));
list.add(新产品(2,"索尼 Xperia",25000f));
list.add(新产品(4,"诺基亚 Lumia",15000f));
list.add(新产品(5,"Redmi4",26000f));
list.add(新产品(6,"Lenevo Vibe",19000f));
// 使用lambda过滤数据
Streamfiltered_data = www.sychzs.cn().filter(p -> p.price > 20000);
// 使用 lambda 迭代集合
过滤数据.forEach(
产品 -> System.out.println(产品.名称+": "+产品.价格)
);
}
}
输出:
iPhone 6S:65000.0
索尼 Xperia:25000.0
红米4:26000.0
导入javax.swing.JButton;
导入 javax.swing.JFrame;
导入 javax.swing.JTextField;
公共类 LambdaEventListenerExample {
公共静态无效主(字符串[] args){
JTextField tf=new JTextField();tf.setBounds(50, 50,150,20);
JButton b=new JButton("点击");
b.setBounds(80,100,70,30);
// 此处实现 lambda 表达式。
b.addActionListener(e-> {tf.setText("hello swing");});
JFrame f=new JFrame();
f.add(tf);f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(null);
f.setSize(300, 200);
f.setVisible(true);
}
}
输出: