匿名内部类与lamda表达式
2024-09-06 18:46:55
1、为什么要使用lamda表达式
从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面向对象编程之中的一些繁琐的问题。
面向对象在其长期发展的过程中一直有一部分的反对者认为面向对象过于繁琐,比如使用匿名内部类:
1 public interface IMessage {
2 public void send(String str);
3 }
4 public class Demo {
5 public static void main(String args[]){
6 IMessage msg = new IMessage() {
7 @Override
8 public void send(String str) {
9 System.out.println("消息发送:"+str);
10 }
11 };
12 msg.send("hahahaha");
13 }
14 }
上面语句的核心功能只有一行核心语句,但是为了这一行核心语句依然需要按照完整的面向对象给出的设计结构进行开发。所以Lambda出现。
1 public interface IMessage {
2 public void send(String str);
3 }
4 public class Demo {
5 public static void main(String args[]){
6 IMessage msg = (str)->{
7 System.out.println("发送消息:"+str);
8 };
9 msg.send("hahahaha");
10 }
11 }
这种形式就避免了复杂的面向对象结构化的要求。
Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method)只有一个抽象方法(但可以有default和static方法),以IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何其他方法定义,所以这样的接口就被称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用
2、lamda表达式怎么用
对于Lambda表达式而言,提供了如下几种格式
1) 方法没有参数:()-->{ };
2) 方法有参数:(参数,参数)-->{ };
3) 如果现在只有一行语句返回:(参数,参数)-->语句;
我们看下第三种
1 public interface IMath {
2 public int add(int x,int y);
3 }
4 public class Demo {
5 public static void main(String args[]){
6 IMath math = (t1,t2) -> t1 + t2;
7 System.out.println(math.add(10,20));
8 }
9 }
利用Lambda表达式可以使代码更加简便
其中一个很经典的应用就是多线程Runnable接口的例子
1 public class Test{
2 public static void main(String[] args) {
3 /*
4 匿名内部类的方式
5 new Thread(new Runnable() {
6 @Override
7 public void run() {
8 System.out.println("nihao");
9 }
10 }).start();
11 System.out.println("你好");
12 */
13
14
15 //lambda的方式
16 new Thread(()-> {
17 for(int i = 1 ; i<100 ; i++){
18 System.out.println("It is a lambda function!");
19 }
20 }).start();
21 }
22 }
说明:lamda表达式并非只有代替匿名内部类这一个功能,还有其他的高阶功能本人未探究。
参考链接:https://blog.csdn.net/qq_36582604/article/details/81393732
最新文章
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
- oracle select into 的时候提示未找到数据
- webstorm 运行配置gulp
- Java中serialVersionUID
- HOOK技术的一些简单总结
- javascript保留关键字
- UIResponder类
- C++ atol
- Qt之自定义界面(QMessageBox)
- 转载:用Dreamweave cs 5.5+PhoneGap+Jquery Mobile搭建移动开发
- ListView 滚动条的图标样式
- 基于ThinkPHP 5.0与Vue.JS 2.x的前后端开源开发框架VueThink
- 重载Cocos2D生存期的方法
- boost::bad_weak_ptr的原因
- Socket模拟HTTP请求
- vue2.0 中#$emit,$on的使用详解
- python基础学习Day8 文件的基本操作
- TensorFlow 中的 tf.train.exponential_decay() 指数衰减法
- OpenGL chapter4 基础变换
- 使用C#和HtmlAgilityPack解析HTML
热门文章
- MySQL配置参数innodb_flush_log_at_trx_commit
- [源码解析] PyTorch 分布式(10)------DistributedDataParallel 之 Reducer静态架构
- 互联网java面试宝典
- CF1444C Team-Building
- [NOI2020] 美食家
- 洛谷 P6276 - [USACO20OPEN]Exercise P(组合数学+DP)
- HDU 6036 Division Game
- pcm.x代码分析
- 生物信息Linux用户创建与配额设置
- snpEff注释结果各区域统计之和大于变异总数?