Java:lamada表达式干了些什么?
2023-03-20 15:32:08 时间
代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效。
要把有限的时间花到其它有意思的事情上去。
lamada表达式简化了代码。
使用时机:
待实现的接口只有一个未实现方法。
使用格式:
这等同于创建了一个匿名子类对象。
()->{
//方法体
};
一、目的
学习简化代码的思路,使用jdk8新特性lamada表达式。
二、简化过程
某个接口,只有一个方法。
比如这个:
package java.lang; @FunctionalInterface public interface Runnable { void run(); }
或者是这个:
interface MyInterface{ void sayHi(); }
(一阶段)、正常使用
一般我们要使用Runable的实现类开启一个线程,需要实现Runnable接口,调用Threead类的start方法:
public class LeaningLamda implements Runnable{ public static void main(String[] args) { new Thread(new LeaningLamda()).start(); } @Override public void run() { System.out.println(this.getClass()+"我已经在跑了!"); } }
或者用sayHi方法干点什么,要先实现接口,再调用:
public class LeaningLamda2 implements MyInterface{ public static void main(String[] args) { new LeaningLamda2().sayHi(); } @Override public void sayHi() { System.out.println("ok ok ok ok ,i am say Hi!"); } }
(二阶段)、使用内部类
如果这个方法我就用一次,那我可以在内部类中实现它,提高程序性能:
public class LeaningLamda{ static class MyRun implements Runnable{ @Override public void run() { System.out.println(this.getClass()+"我已经在跑了!"); } }
public static void main(String[] args) { new Thread(new MyRun()).start(); } }
一样的用sayHi方法:
public class LeaningLamda2 { static class MyHi implements MyInterface{ @Override public void sayHi() { System.out.println("ok ok ok ok ,i am say Hi!"); } } public static void main(String[] args) { new MyHi().sayHi(); } }
(三阶段)、局部内部类
既然只使用一次,那我为啥不把它放在使用的方法里面去,性能不就又UpUpUpUp了吗?
像这样:
public class LeaningLamda{ public static void main(String[] args) {
class MyRun implements Runnable{ @Override public void run() { System.out.println(this.getClass()+"我已经在跑了!"); } } //调用在定义后面,谢谢。 new Thread(new MyRun()).start(); } }
或是这样:
public class LeaningLamda2 { public static void main(String[] args) { class MyHi implements MyInterface{ @Override public void sayHi() { System.out.println("ok ok ok ok ,i am say Hi!"); } } new MyHi().sayHi(); } }
(四阶段)、匿名内部类
我就用一次,要什么名字?能少输入一个字符都是赚的。
你看:
public class LeaningLamda{ public static void main(String[] args) { //需要借助父类或者接口来声明 new Thread(new Runnable(){ @Override public void run() { System.out.println(this.getClass()+"我已经在跑了!"); } }).start(); } }
又如:
public class LeaningLamda2 { public static void main(String[] args) { new MyInterface(){ @Override public void sayHi() { System.out.println("ok ok ok ok ,i am say Hi!"); } }.sayHi(); } }
(五阶段)、lamda表达式
jdk 8 看不下去了,给我们提供了一个更加简化的方案。
你看:
使用lamda表达式实现创建单个简单线程
public class LeaningLamda{ public static void main(String[] args) { new Thread(()-> { System.out.println("我已经在跑了!"); } ).start(); } }
lamda表达式sayHi:
public class LeaningLamda2 { public static void main(String[] args) { //此处需要借助一个父类或接口对象来存放,调用它 MyInterface ls = ()->{ System.out.println("ok ok ok ok ,i am say Hi!"); }; ls.sayHi(); } } interface MyInterface{ void sayHi(); }
二、lamada表达式知识
(一)、参数
lamda表达式中的参数可以不指定类型,它会自适应。
public class LeaningLamda2 { public static void main(String[] args) { MyInterface ls = (i,str)->{ System.out.println("int:"+i); System.out.println("String:"+str);}; ls.sayHi(520,"i love you!"); } } interface MyInterface{ void sayHi(int i,String str); }
运行结果:
(六阶段)、只有一个参数
那我括号都可以省了!
public class LeaningLamda2 { public static void main(String[] args) { MyInterface ls = str-> {System.out.println("String:"+str);}; ls.sayHi("i love you!"); } } interface MyInterface{ void sayHi(String str); }
运行结果:
(二)、返回值
如果有返回值,正常返回:
public class LeaningLamda2 { public static void main(String[] args) { MyInterface ls = (String str)-> { String str2 = "最后的赢家是:"+str; return str2;}; System.out.println(ls.sayHi("lurenjia")); } } interface MyInterface{ String sayHi(String str); }
(阶段七)、只有一条语句
如果方法只有一条语句,那大括号也没有必要,可以省略:
public class LeaningLamda2 { public static void main(String[] args) { MyInterface ls = (int i,String str)-> System.out.println("int:"+i+"----String:"+str); ls.sayHi(520,"i love you!"); } } interface MyInterface{ void sayHi(int i,String str); }
(阶段八)、那一条语句是return语句
直接把return都省了。
public class LeaningLamda2 { public static void main(String[] args) { MyInterface ls = str-> "最后的赢家是:"+str; System.out.println(ls.sayHi("中国")); } } interface MyInterface{ String sayHi(String str); }
运行结果:
三、总结
1、接口只有一个方法,可有参数,可有返回值。
2、本方法内容简单,使用较少。
3、基本形式为:
接口或父类 名称 = (参数类型1 参数1,参数类型2 参数2,...)->{
内容
};
名称.方法(参数1,参数2,...);
4、可以省略的是:
1、参数类型可省,若只有一位,则括号可省。
2、方法内容只有一条内容,大括号可省。
3、内容只有一句return语句,return可省,直接写值。
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十