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

相关文章
|
2月前
|
Java
课时15:Java运算符(基础数学运算符)
课时15介绍了Java中的基础数学运算符,涵盖加、减、乘、除及自增自减运算。强调了运算符的优先级和使用括号的重要性,并通过范例展示了四则运算与自增自减的具体应用。提醒编写代码时应保持简洁,避免复杂的表达式,确保代码易读性和可维护性。
|
2月前
|
Python
课时32:算术运算符
本文围绕Python第二章最后一部分运算符知识展开,着重介绍了运算符的概念、分类,并详细阐述了算术运算符的具体内容,包括加、减、乘、除、整除、幂运算和取模运算,还说明了运算符使用时的注意事项,如需对变量重新赋值才会产生影响,书写时运算符前后可加空格。 1.运算符概述 2.运算符分类 3.算术运算符详解 4.运算符使用注意事项
|
2月前
|
Java
课时17:Java运算符(关系运算符)
范例:进行关系判断。如果要进行关系运算的操作可使用:>、<、>=、<=、!=(不等于)、==。所有的关系运算符判断完成的数据返回结果都是布尔类型(boolean)。只要使用关系运算符进行逻辑判断,最终的结果就是布尔型,只有true和false两种结果,而且能和if语句结合使用。
|
2月前
|
Python
课时 34 :关系运算符
课时34介绍了关系运算符,用于比较两个值之间的关系,返回布尔值True或False。常见的关系运算符包括:大于(&gt;)、小于(&lt;)、大于等于(&gt;=)、小于等于(&lt;=)、等于(==)、不等于(!=)。此外,is和is not用于比较对象的身份(ID),而非值。字符串比较基于Unicode编码逐位进行。注意,不同类型的数据(如字符串与数字)不能直接比较,需先转换类型。掌握这些运算符对编程至关重要,建议多编写代码练习。
|
2月前
|
Java 程序员 数据处理
课时19:Java运算符(位运算符)
课时19介绍Java中的位运算符,涵盖进制转换、位与、位或及移位操作。重点讲解了二进制与其他进制的转换方法,通过具体范例演示了位与和位或运算的过程,并展示了八进制和十六进制的处理方式。此外,还解释了逻辑运算符(&&、||)与位运算符(&、|)的区别及其应用场景,特别是位运算在加密中的应用。
|
2月前
|
Java
课时19:关系运算符
课时19介绍了关系运算符的使用,包括大于、小于、等于(==)等,返回布尔值。示例展示了大小比较和相等判断,强调“=”用于赋值,“==”用于比较。还演示了字符与数字间的自动转型及比较。
|
2月前
|
Java
课时18:数学运算符
课时18介绍了Java中的数学运算符,包括四则运算和简化运算符(如+=、-=等)。范例展示了如何实现简单的四则运算和求模操作。此外,还详细解释了自增(++)和自减(--)运算符的两种使用方式:前置和后置。为了提高代码可读性,建议在现代编程中尽量采用更清晰的表达方式,避免复杂的简化运算符组合。
|
2月前
课时17:运算符简介
课时17介绍运算符在程序开发中的作用,强调运算符的优先级和使用括号简化代码的重要性。编程应避免复杂计算,保持代码简单易懂,推荐使用括号明确运算顺序,提高可读性和准确性。示例展示了复杂的运算符组合可能导致代码难以理解。
|
Java
Lambda 表达式复习
Lambda 表达式复习
57 1
|
Java 大数据
Java程序设计基础笔记 • 【第3章 运算符与表达式】
3.1 运算符(一) 3.1.1 赋值运算符 3.1.2 算数运算符 3.1.3 复合运算符 3.1.4 实践练习(一) 3.1.5 实践练习(二) 3.2 运算符(二) 3.2.1 关系运算符 3.2.2 逻辑运算符 3.2.3 三母运算符 3.2.4 实践练习 3.3 运算符优先级和表达式 3.3.1 表达式 3.3.2 运算符和优先级 3.3.3 实践练习 3.4 数据类型转换 3.4.1 自动类型转换 3.4.2 强制类型转换 3.4.3 实践练习(一) 3.4.4 实践练习(二) 总结:
257 0
Java程序设计基础笔记 • 【第3章 运算符与表达式】