java之Lamda表达式的介绍
Lamda表达式:
λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念:
语法如下:
(参数) ->表达式 或 (参数) ->{ 语句; }
Lambda表达式允许你直接把一个代码块赋值给一个变量
无参有返回值Lambda表达式:
() -> 2 //该Lambda表达式表示返回值为2
有参有返回值Lambda表达式:
一个参数:
x -> 2 * x //x为参数,返回2*x的值
2个参数:
(x, y) -> x + y //x,y均为参数,返回两者的和
有参无返回值Lambda表达式:
(String s) -> System.out.print(s) //s为参数,将其输出
为什么要使用lambda表达式?
避免匿名内部类定义过多可以让代码看起来很简洁去掉了大量没有意义的代码,只留下核心的逻辑
在讲如何使用Lamda表达式之前,我们先来学习一下FunctionalInterface (函数式接口)
函数式接口:
任何接口,如果只包含唯一一个抽象方法
,那么它就是一个函数式接口,对于函数式接口,我们可以通过lambda表达式来创建该接口的对象
举例:
//定义函数式接口
interface mylike{void lambda();
}
JDK1.8新特性,default默认方法可以有具体的实现:
//定义函数式接口
interface mylike{void lambda();default void test2() {System.out.println("我是default默认方法可以有具体的实现");}}
Lambda表达式的推导:
定义函数式接口:
package Lambda;public interface fun_interface {void show();
}
匿名函数的语法:
new 接口/类名(参数1, 参数2...){实现方法1(){}实现方法2(){}......};
匿名函数的方法是:返回值 方法名 参数列表 方法体,我们只需要关心参数列表 方法体,而不用关心方法名和返回值
使用匿名内部类实现该函数式接口:
package Lambda;public class fun_test1 {public static void main(String[] args) {fun_interface fun_interface=new fun_interface(){@Overridepublic void show() {System.out.println("重写函数式接口中的方法");}};fun_interface.show();}
}
在上述代码中,我们没有创建实现类[fun_test1]的实例化对象就实现了具体的show()方法,通常,我们也习惯用匿名内部类的方式创建并启动线程
但是上面的代码还是略显麻烦
Lambda表达式的写法:
package Lambda;
public class lambda_test {public static void main(String[] args) {fun_interface fun_interface=()->System.out.println("重写函数式接口中的方法");fun_interface.show();}
}
无论是匿名内部类还是Lambda表达式都可以正确实现这个接口,但使用匿名内部类,我们会发现在代码量上减少了许多,但其实Lambda表达式的本质就是一个匿名内部类
使用Lambda表达式的前提是:接口为函数式接口
函数式接口的不同类型:
package Lambda;public class fun_test3 {//无返回值无参数interface NoParameterNoReturn {void test();}//无返回值一个参数interface OneParameterNoReturn {void test(int a);}//无返回值多个参数interface MoreParameterNoReturn {void test(int a,int b);}//有返回值无参数interface NoParameterReturn {int test();}//有返回值一个参数interface OneParameterReturn {int test(int a);}//有返回值多参数interface MoreParameterReturn {int test(int a,int b);}}
Lambda表达式与函数式接口的简单应用:
package Lambda;public class fun_lambda {public static void main(String[] args) {//无返回值无参数NoParameterNoReturn parameterNoReturn=()-> System.out.println("这里是重写后的方法");parameterNoReturn.test();//无返回值一个参数//写法1OneParameterNoReturn oneParameterNoReturn=(a)->{System.out.println(a);};oneParameterNoReturn.test(99);//写法2OneParameterNoReturn oneParameterNoReturn1=a->System.out.println(a);//只有一个参数,小括号可以省略;只有一条语句,花括号可以省略oneParameterNoReturn1.test(99);//无返回值多个参数MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a+b);};moreParameterNoReturn.test(99,1);//有返回值无参数NoParameterReturn noParameterReturn=()->{return 520;};int ret=noParameterReturn.test();System.out.println(ret);//有返回值一个参数OneParameterReturn oneParameterReturn=(a)->{return a+1;};int ret1=oneParameterReturn.test(99);System.out.println(ret1);//有返回值多参数MoreParameterReturn moreParameterReturn=(a,b)->a*b;//相当于(a+b)->{return a*b;}int ret2=moreParameterReturn.test(4,8);System.out.println(ret2);}
}
interface NoParameterNoReturn {void test();
}
//无返回值一个参数
interface OneParameterNoReturn {void test(int a);
}
//无返回值多个参数
interface MoreParameterNoReturn {void test(int a,int b);
}
//有返回值无参数
interface NoParameterReturn {int test();
}
//有返回值一个参数
interface OneParameterReturn {int test(int a);
}
//有返回值多参数
interface MoreParameterReturn {int test(int a,int b);
}
输出:
这里是重写后的方法
99
99
100
520
100
32
注:
参数类型可以省略,如果需要省略,每个参数的类型都要省略。参数的小括号里面只有一个参数,那么小括号可以省略如果方法体当中只有一句代码,那么大括号可以省略如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字
Lambda表达式的优缺点:
优点:
在代码层次上来说,使代码变得非常的简洁,开发迅速
方便函数式编程
非常容易进行并行计算
Java 引入 Lambda,改善了集合操作
缺点:
代码可读性变差
在非并行计算中,很多计算未必有传统的 for 性能要高
不容易进行调
java之Lamda表达式的介绍相关推荐
- [Java8] lamda表达式及Stream API一览
前言 不知道从什么时候开始. Java8开始刮起了一阵妖风. 那就是lamda表达式. 也叫函数式编程, 大概是和隔壁的Scala进行学习吧. 但是Java8也是甲骨文最后一个免费的版本. 大概率, ...
- java1.8 lamda表达式
1.方便匿名内部类的使用 直接使用lamda表达式编写接口的实现 参数为接口抽象方法的入参 后面接着方法的实现 然后就可以作为该接口的对象使用了 2.lamada表达式语法 (parameters) ...
- java工作笔记017---java8新特性_使用lamda表达式进行List分组_排序_去重_随时更新
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个电视购物项目后台采用java1.8编写,有些业务复杂的地方,使用lamda表达式可以简化开发 ...
- Java回调的四种写法(反射、直接调用、接口调用、Lamda表达式)
1. 引言 在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 以上是维基百科对&qu ...
- Java --Lamda表达式
Lamda:属于函数式编程的概念: interface IMessage {public void print() ; } public class TestDemo {public static v ...
- java构造函数传参_java 构造函数 , 参数传递 , lamda表达式
1. java 子类中必须显式或者隐式的调用父类的构造方法,原因是双亲委派机制.java 在创建一个对象是,会在构造方法中依次向上调用父类的构造方法. 为了找到父类的构造方法,所以子类应显式或者隐式 ...
- Java SE 8新功能介绍:使用Streams API处理集合
使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- Java代码缺陷自动分析工具介绍
Java代码缺陷自动分析工具介绍 ...
最新文章
- Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值
- js和html邮箱注册的正则,js邮箱正则表达式
- Keras搭建YoloV4目标检测平台
- VMware Workstation 14 激活码
- WSAENOBUFS: No buffer space available in SAP
- 天翼云从业认证课后习题(3.5云安全产品)
- Redis 6.0 新特性 ACL 介绍
- 企业员工工资管理系统
- oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...
- consul运维入门
- hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 【组合数学 + 数论 + 模意义下的FFT】...
- 【图像增强】基于matlab同态增晰图像增强【含Matlab源码 962期】
- 中国大学MOOC 程序设计入门——C语言 翁凯 编程测试题汇总
- jsmy97时间控件,时间范围选择
- 利用gretna计算小世界网络属性等图论指标笔记
- kubectl rollout restart重启pod
- ofo 上海深圳等公司相继注销
- 利用Cam对Hopenet网络模型进行可视化
- pdf转word免费的软件,总有一款适合你的
- 如何提取到网页上播放的视频