课时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 表达式进行描述

相关文章
|
算法 前端开发 Java
在字节当了几个月的牛马,醒悟了。
以前也分享过不少实习体验,比如去年就分享了一位师弟的美团实习体验:美团实习三个月,我受益良多,今天来分享一下一位学习圈中学弟的字节实习体验。
406 0
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
178 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
1月前
|
存储 弹性计算
阿里云服务器一小时收费价格,不同ECS是实例按量付费1小时费用整理
阿里云ECS云服务器按小时计费,价格根据实例类型和配置不同而异。例如经济型e实例2核2G配置0.094元/小时,通用算力型u1实例2核4G配置0.351元/小时,计算型c9i实例2核4G配置0.3873元/小时,4核8G配置0.7746元/小时。不同规格实例价格差异明显,具体以官网信息为准。
|
6月前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
209 2
|
6月前
|
SQL
seata是怎么进行分布式事务控制的
seata是怎么进行分布式事务控制的
|
4月前
|
数据采集 运维 监控
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
随着互联网数据采集需求的增长,传统爬虫架构因固定IP易封禁、资源浪费及扩展性差等问题逐渐显现。本文提出基于Serverless与代理IP技术的新一代爬虫方案,通过动态轮换IP、弹性调度任务等特性,显著提升启动效率、降低成本并增强并发能力。架构图与代码示例详细展示了其工作原理,性能对比数据显示采集成功率从71%提升至92%。行业案例表明,该方案在电商情报与价格对比平台中效果显著,未来有望成为主流趋势。
109 0
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
|
6月前
|
数据采集 监控 数据挖掘
京东、淘宝、义乌购等电商平台的Api数据分析
京东、淘宝、义乌购等电商平台的数据分析涵盖数据收集、预处理、分析及应用优化。数据来源包括数据库、日志文件和网络爬虫,通过SQL查询、日志解析和爬虫抓取获取数据。预处理阶段进行数据清洗、缺失值处理和异常值检测。分析方法包括描述性分析、对比分析、漏斗分析等,关注成交金额、转化率等关键指标。最终基于分析结果制定策略并评估效果,持续优化平台运营。
|
6月前
|
运维 Serverless 云计算
Serverless,云计算3.0阶段
Serverless是一种云计算服务模式,让开发者只需专注于编写业务逻辑代码,无需管理底层基础设施如服务器、存储和网络。相比传统Serverful架构,Serverless降低了运维成本,提高了开发效率,并通过弹性伸缩应对流量峰谷,按实际资源消耗付费,显著降低资源浪费和费用开销。
221 4
Serverless,云计算3.0阶段
|
IDE 开发工具 Python
python中语法缩进错误处理
【7月更文挑战第8天】
448 2
|
安全 Java Android开发
探索安卓应用开发的新趋势:Kotlin和Jetpack Compose
在安卓应用开发领域,随着技术的不断进步,新的编程语言和框架层出不穷。Kotlin作为一种现代的编程语言,因其简洁性和高效性正逐渐取代Java成为安卓开发的首选语言。同时,Jetpack Compose作为一个新的UI工具包,提供了一种声明式的UI设计方法,使得界面编写更加直观和灵活。本文将深入探讨Kotlin和Jetpack Compose的特点、优势以及如何结合使用它们来构建现代化的安卓应用。
356 11

热门文章

最新文章