课时130:Lamda表达式

简介: 课时130介绍了Lambda表达式的基础与应用。从JDK 1.8开始,Java引入了Lambda表达式以简化代码开发,支持函数式编程,减少面向对象编程中的繁琐结构。Lambda表达式适用于只有一个抽象方法(SAM)的接口,如IMessage接口。通过Lambda表达式,开发者可以更简洁地实现接口功能,例如消息发送和数学运算。范例展示了如何使用Lambda表达式替换匿名内部类,使代码更加简洁明了。此外,Lambda表达式还支持无参数、有参数及单行语句的简化形式,进一步提高了代码的可读性和维护性。

课时130:Lamda表达式

Lamda表达式的基础处理形式

 

从JDKl.8开始简化使用者进行代码的开发,专门提供有Lambda表达式支持,利用此操作形式可以实现函数式的编程。对于函数式编程比较著名的语言:Haskell、Scala。利用函数式的编程可以避免面向对象编程之中的一些繁琐的处理问题。


通过如下网站了解函数式编程的使用概念。

image.png

 

面向对象在其长期发展的过程之中有部分的反对者,这些反对者认为面向对象的设计过于复杂,并且过于繁琐。以最简单的程序为例子 。


范例:观察传统开发中的问题

Interface IMessage { 
Public void send(String str);
}
Public class JavaDemo {
Public static void main(String args[]){
IMessage msg new IMessage ()
Public void send(){
System.out.println("消息发送:"+str):
          }
}
msg.send("www.mldn.cn");

进行编译执行,执行结果如下。

image.png

 

D:\mldnjava>javac JavaDemo.java
JavaDemo..java:l0:错误:需要';
1个错误
D:\mldnjava>java JavaDemo
www.mldn.cn
D:\mldnjava>
出现错误,进行更正。
Interface IMessage { 
Public void send(String str);
}
Public class JavaDemo {
Public static void main(String args[]){
IMessage msg new IMessage ()
Public void send(){
System.out.println("消息发送:"+str):
          }
} ;
msg.send("www.mldn.cn");

image.png

D:\mldnjava>javac JavaDemo.java
JavaDemo.java:6:错误:〈匿名JavaDemo$1>不是抽象的,并且未覆盖IMessage中的抽象方法send(String)
IMessage msg new IMessage(){
JavaDemo.java:8:错误:找不到符号
System.out.printin("消息发送”+str);
符号:变量str
2个错误。
再次更正。
Interface IMessage { 
Public void send(String str);
}
Public class JavaDemo {
Public static void main(String args[]){
IMessage msg new IMessage ()
Public void send(String str){
System.out.println("消息发送:"+str):
          }
};
msg.send("www.mldn.cn");

执行程序出现。进行代码编译,再次执行。

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
消息发送:www.mldn.cn
D:\mldnjava>

上述成功。

上述是一个简单的应用程序。

在这样一个程序里面,实际上核心的功能只有一行语句,“System.out.println("消息发送:"+str);”,这一行的核心语句需要按照完整的面向对象给出的设计结构进行开发。

如下图所示:

Public static void main(String args[]){
IMessage msg new IMessage({
Public void send(String str)
System.out.println("消息发送:"+str);
}
}
msg.send("www.mldn.cn");

于是这些问题随着技术的不断发展越来越突出。在这种情况下java提供Lambda的表达式。


范例:使用Lambda表达式实现与之前完全一样的功能。

Public class JavaDemo {
Public static void main(String args[]){
IMessage msg (str)->{
System.out.println("发送消息:"+st);

完成代码再次编译,执行。

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
发送消息:wwww.mldn.cn
D:\mldnjava>

观察程序代码,整个代码实现过程之中完成一行语句System.out.println("发送消息:"+st);

目前整个程序代码只编写一行语句,利用这种形式就避免复杂的面向对象结构化的要求。这就是Lambda表达式的基本处理形式。


Lambda能够简化代码有一定的要求。

Lambda表达式使用,须有一个重要的实现要求:

SAM (Single Abstract Method),有一个抽象方法,以之前IMessage接口为例,在这个接口发现提供有一个Send方法,除此外无其它方法定义,此接口就被称为函数式接口,所以函数式接口才可以被Lambda表达式使用。


这就是Lambda的主要形式。

在代码中加入新方法,如下:

Interface IMessage {
Public void send(String str);
Public void get();
}
代码上显示:
D:\mldnjava>javac JavaDemo.java
JavaDemo..java:7: 错误:不兼容的类型:IMessage不是函数接口
IMessage msg (str)->{
在接口IMessage中找到多个非覆盖抽象方法
1个错误

image.png

通常情况下为标明函数式接口,如下所示:

Functional Interface//函数式接口
Interface IMessage {
Public void send(String str);
Public void get();
}

再次编译,执行。

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
发送消息:www.mldn.cn
D:\mldnjava>
成功。
范例:使用函数式接口注解
方法仅有一个。
Functional Interface//函数式接口
Interface IMessage {
Public void send(String str);
Public void send();
}

进行执行编译,

image.png

D:\mldnjava>javac JavaDemo.java
JavaDemo.java:l:错误:意外的FunctionalInterface注释
FunctionalInterface //函数式接口
IMessage不是函数接口
在接口IMessage中找到多个非覆盖抽象方法
1个错误

顾JDK1.8,接口可以定义普通方法和Static方法

如下写出一个公共方法

image.png

Functional Interface//函数式接口
Interface IMessage {
Public void send(String str);
Public default void print(){}
 不加Default则为Upstract

在使用函数式编程时,出现掣肘行为。

image.png

Public class JavaDemo {
Public static void main(String args[]){
IMessage msg (str)->{
System.out.println("消息发送:"+str):
          }
          msg.send ("www.mldn.cn");
msg.print () ;
}
}

在新版本之中提供有Default的方法的方法也都是为函数式开发准备出来的。

这就是Lambda具体操作。

对于Lambda表达式而言,提供有如下几种格式:

·方法没有参数:()->{};

·方法有参数:(参数,参数)->{;

·如果现在只有一行语句返回:(参数,参数)->语句;

范例:定义没有参数的方法

回到代码中:

image.png

Public class JavaDemo
Public static void main(String args[]){
IMessage msg ()->
System.out.println("发送消息:w.mldn.cn");
};
msg.send();
}
}

编译查看当前结果:

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
发送消息:www.mldn.cn
D:\mldnjava>

这就是没有参数的处理形式。


范例:定义有参数的处理形式

image.png

FunctionalInterface //函数式接口
Interface IMath
Public int add(int x,int y);
}
Public class JavaDemo
Public static void main(String args[]){
IMath math (t1,t2)->{
Return t1+t2 ;
};
System.out.println (math.add(10,20));
}
}

代码进行编译,再依次执行。

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
30
D:\mldnjava>

以上的表达式之中你会发现只有一行语句,这个时候也可以进一步简化。


范例:简化Lambda操作

image.png

FunctionalInterface //函数式接口
Interface IMath
Public int add(int x,int y);
}
Public class JavaDemo
Public static void main(String args[]){
IMath math (t1,t2)->t1+t2;
System.out.println (math.add(10,20));
}
}

编码再次编译,执行。

image.png

D:\mldnjava>javac JavaDemo.java
D:\mldnjava>java JavaDemo
30
D:\mldnjava>

利用Lamda表达式可以摆脱传统面向对象之中关于结构的限制,使得代码更加的简便。


Lamda 的主要目的是替换掉只有 SAM 标准的匿名内部位,只有一个抽象方法。如果有多个创作方法,不能替换掉,但可帮助我们避免结构化限制这是它的优势所在,熟悉 Lamda 的操作,若出现函数接口,都将用 Lamda 表达式进行描述

目录
打赏
0
2
2
1
1046
分享
相关文章
在字节当了几个月的牛马,醒悟了。
以前也分享过不少实习体验,比如去年就分享了一位师弟的美团实习体验:美团实习三个月,我受益良多,今天来分享一下一位学习圈中学弟的字节实习体验。
388 0
|
4月前
|
SQL
seata是怎么进行分布式事务控制的
seata是怎么进行分布式事务控制的
京东、淘宝、义乌购等电商平台的Api数据分析
京东、淘宝、义乌购等电商平台的数据分析涵盖数据收集、预处理、分析及应用优化。数据来源包括数据库、日志文件和网络爬虫,通过SQL查询、日志解析和爬虫抓取获取数据。预处理阶段进行数据清洗、缺失值处理和异常值检测。分析方法包括描述性分析、对比分析、漏斗分析等,关注成交金额、转化率等关键指标。最终基于分析结果制定策略并评估效果,持续优化平台运营。
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
110 2
|
11月前
|
十六进制是什么
【8月更文挑战第9天】 十六进制是什么
2385 1
|
9月前
|
工信部ICP备案查询指南
【10月更文挑战第12天】工信部ICP备案查询指南
2108 0
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
上海交大研究团队在Nature子刊发表论文,提出基于深度学习的视触觉动态重建方案,结合高密度可拉伸触觉手套与视觉-触觉联合学习框架,实现手部与物体间力量型交互的实时捕捉和重建。该方案包含1152个触觉感知单元,通过应变干扰抑制方法提高测量准确性,平均重建误差仅1.8厘米。实验结果显示,其在物体重建的准确性和鲁棒性方面优于现有方法,为虚拟现实、远程医疗等领域带来新突破。
159 32
docker中挂载数据卷到容器
【10月更文挑战第13天】
309 2
SpringMVC系列之 javax.servlet.http.HttpServletRequest.getDispatcherType()Ljavax/servlet/DispatcherType;
文章讨论了在SpringMVC中遇到的`javax.servlet.http.HttpServletRequest.getDispatcherType()Ljavax/servlet/DispatcherType;`错误,并提供了通过升级Tomcat到8.x版本和检查pom依赖配置来解决这个问题的方法。
HTML5 服务器发送事件(Server-Sent Events)详解
**服务器发送事件(Server-Sent Events, SSE)** 是一种用于构建单向实时通信的技术,允许服务器主动向客户端(通常是浏览器)推送更新。SSE 提供了一个简单的 API,非常适合实时应用,如新闻更新、天气变化、社交媒体通知等。SSE 基于 HTTP 协议,通过长连接实现数据传输。其主要优点包括简洁的 API、持久连接和自动重连功能。大多数现代浏览器都内置了对 SSE 的支持。通过简单的服务器端和客户端代码,可以轻松实现数据的实时推送和接收。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等