java-Lambda 语法总结

文章目录

  • Lambda 语法概览
  • Lambda 表达式语法
    • 1.Lambda 表达式与函数接口
    • 2.Lambda 遇上 this final

Lambda 语法概览

String(] names = {Justi n ”,”caterpillar”,Bush " }; 
Arrays . sort (names, new Compara tor<String> () { publ int compare (String namel , String name2) { retu rn namel . length () - name2 . length() ;}
});

Arrays ort ()方法可以用来 ,只不过,你得告诉它两个元 比较时顺序是什么, sort()
规定得操作 java.util Comparator 说明这件事,然而那个匿名类的语法有些冗长。先别急着
使用 Lambda 法, 如果想稍微改变一下 Arrays sort ()该行的可读性,在 JDK8 出现前,可以

Comparator<String> byLength =new Comparator<String>() { public int compare(String namel , String name2) { return namel . length() - name2 . length();}
});String[] names = {Justin,”caterpillar”,Bush); 
Arrays . sort (names, byLength) ;

通过变量 byLength ,确实是可以让排序的意图清楚许多,只是操作 Comparator 时的匿名类
依旧冗长,有太多重复的信息,如果使用 JDK8 的话,可以使用 Lambda 特性去除重复的信息。
例如,声明 byLength 时已经写了一次 Comparator<String >,为什么操作匿名类时又得写一
Comparator<String ?使用 JDK8 Lambda 表达式的话,可以 为:

Comparator byLength =
(String namel , Str ng name2) -> namel . length() - name2 . length( );
重复 Comparator<String >信息从等号右边去除了,因为原 匿名类只有 个方法要操
作,因此在使用 Lambda 达式时,实际上从等号左边的 Corr rator<String >声 明就可以知道,
Lambda 表达式实际上是要操作 Comparator<Str 工口 compare ()方法。仔细看看,还有重复
信息,既然声明变量时使用了 Comparator<String >,为什么 Lambda 表达式的参数上又得声明一
String ?实际上确实不用,因为编译程序可 以从 byLength 变量的声明类型,推断 name1、name2 类型 ,因此可以再简化为:

Cornparator<String> byLength = (narnel , narne2) - > narnel. length() - narne2 . length() ;

直接放 Arrays sort ()方法中

package cc . openhorne ; 
import java . util . Arrays; 
public class LarnbdaDerno { public stat VO rnain(String[] args) { String[] names = {Justin,”caterpillar”,Bush); Arrays . sort (names , (namel , name2) -> namel . length() - name2. length() ); Systern . out .println(Arrays.toString(narnes)) ;}
}

Lambda 表达式语法

1.Lambda 表达式与函数接口

如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。

Comparator<St ring> byLength = (String namel , String name2) - > namel . length( ) - name2.length ();

拆开为两 分, 等号右 Lambda 表达 Expressio ,等号左 作为 Lambda
达式的目标类型 Target Type 。先来看看等号右边的 Lambda 表达式

(String namel , String ame2 - > namel . l e ngth() name2 . length()

Lambda 达式表示接受两 参数 namel name2 ,参数 String 类型,目前-〉右
义了 返回结果 式, 果运算 比较复杂,必须使 多行描述, 以加入门定
述区块,如果 返回值,必须加 return ,例如:

(String namel , String ame2) - > { Stri ng namel = namel.trim() ; String name2 = name2.trim() ; return namel . length () - name2 . length ();
}

区块可 由数个描述语句组成 本上不 议如此使用。在 Lambda 表达式时
尽量使用简单的 ,如 操作比较复杂,可以 方法参考等其 方式。
Lambda 中,即 接受任何 数,也必须 下括号。 例如:

()-> Justi //不接受参数 返回字符串
() -> System.out.println () //不接受参数 没有返回值

只有Lambda 达式的情况下, 参数的类型必须写 ,如果有 目标类型的话,在编译程
序可推断 类型 况下, 就可 以不写出 Lambda 参数类型。 例如以下范例可以
Comparator<String 中推断出 namel name2 的类型, 实际 String ,因而就不用写 参数类型:

Comparator<Str ng> byLength = (namel , name2) -> namel. length() -name2.length () ;

Lambda 式本身是中性的, 表任 类型 ,同样 Lambda 表达式可用来
表示不 同目标类型 的对象操 。举例而 (name1,name2 ) -> namel1. length () - name2 . length ()
的范例中,用来表示 Comparator 的操作:

public interface Func<P,R>{R apply(P p1, P p2)();
}

同样是(namel , name2) -> namel. length() -name2.length () 这个 达式, 在以下的代码程序中:

Func<String,Integer> func = (name1,name2) -> name1.length() - name2.length();	

就是用来表示 目标类型 Func<String Integer 作, 个例 也示范 如何
Lambda 达式的 类型 Lambda 并没有导入新类型来作为 Lambda 达式的类型 ,而
就现 interface 语法来定义函数接口(Funeti onal Interface ),作为 Lambda 达式的目标
接口 就是接 口,但 求仅具单 抽象方 ,许 口都 这种接 ,如
API 中的 Runnable Callable Comparator ,都只 义了 方法。

public interface Runnable { roid run(); 
}
public interface Callable<V> { V call () throws Exception;
}
public interface Comparator<T> { int compare(T ol , T o2) ;
}

在撰写 Lambda 表达式时,若编译程序可推断出类型,本来可以写为:
Fune func = (s) - > out.println(s) ;
这时括号 是多余 了,可 省略写为:
Fune func = s - > out . println(s) ;

函数接口是仅具单 象方法的接口,不过有时会难 直接分辨接 口是否为函数接口,稍
后就会看到,因为 JDK8 interface 语法做了改进,允许有默认方法 Default Method
而接口可能继承其他接口、 重新定义 某些方法等,这些都会使得确认接口是否为函数接口更为困难。有个新标注 @FunctionalInterface JDK8 被引入,它可以这么使用:

@Functional Interface 
public interface Func<P, R> { R appl y (P p) ;
}

如果接口使用了@Funct inalinterfac 来标注,而本身并非函数接口的话,就会引发编译错
误。例如 以下这个接口:

@Fun ct onalinterface
public interface Function<P, R> { R call (P p) ; R call(P pl , P p2);
}

2.Lambda 遇上 this final

Lambda 式并不是匿名类的语法蜜糖,如果将它当作语法蜜糖 this 实际参考对
象时,就会觉得困惑。先来看 下接下来的程序 了匿名类,先想想看结果会如何显示?

package cc.openhome ; 
import static java . lang . System.out ; 
class Hello { Runnable rl =new Runnable() { public void run() {out.println (this) ; }};Runnable r2 = new Runnable(){public void run() {out.println (toString());}};public String toString () { return "Hello , world";}public class ThisDemo {public static void main(String[] args) {Hello hello = new Hello();hello.rl.run();hello.r2.run();}
}}

你认为执行结果会显示“ Hello, World ”吗?看来并不是

在这里插入图片描述
在这里插入图片描述

如果 Lambda 表达式只是匿名类的语法蜜糖,那么结果也该是显示 cc.openhome. Hello$1@
15db9742 cc.openhome Hello$2@6d06d69c 之类的信息, 事实上,执行结果会是显示两次 Hello
world !” 就是说, Lambda 表达式中 this 的参考对象以及 toString ()(也就是 this. toString () )
接受者,是来自 ambda 周围环境 Context),也就是看 Lambda 表达式是在哪个名称范畴
(Scope),就能参考该范畴 内的名称, 变量或方法。
在上面的范例中,因为是 Hello 类包围了 Lambda 表达式, Lambda 达式可以参考类范畴
中的名称,范例中定义了 He llo toStr ng ()返回” ello world 字符串 ,因而执行时才会
显示两次 Hello, world !”

3.方法与构造函数参考
4.接口默认方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch12:GPU加速模型训练

目录 1、CPU与GPU2、数据迁移至GPU2.1 to函数使用方法 3、torch.cuda常用方法4、多GPU并行运算4.1 torch.nn.DataParallel4.2 torch.distributed加速并行训练 5、gpu总结 往期回顾 pytorch01&#xff1a;概念、张量操作、线性回归与逻辑回归 pytorch02&#xff1a;数据读取Data…

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html

【算法Hot100系列】全排列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【学习iOS高质量开发】——熟悉Objective-C

文章目录 一、Objective-C的起源1.OC和其它面向对象语言2.OC和C语言3.要点 二、在类的头文件中尽量少引用其他头文件1.OC的文件2.向前声明的好处3.如何正确引入头文件4.要点 三、多用字面量语法&#xff0c;少用与之等价的方法1.何为字面量语法2.字面数值3.字面量数组4.字面量字…

vivado IP使用

使用IP源 注意&#xff1a;有关IP的更多信息&#xff0c;包括添加、打包、模拟和升级IP&#xff0c;请参阅VivadoDesign Suite用户指南&#xff1a;使用IP&#xff08;UG896&#xff09;进行设计。在Vivado IDE中&#xff0c;您可以在RTL项目中添加和管理以下类型的IP核心&…

高通sm7250与765G芯片是什么关系?(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

HTML--CSS--边框、列表、表格样式

边框样式 属性&#xff1a; border-width 边框宽度 border-style 边框外观 border-color 边框颜色 需要同时设定三个属性 border-width 边框宽度 取值为像素值 border-style 边框样式 none 无样式 dashed 虚线 solid 实线 border-color 边框颜色 如示例&#xff1a; 为div设…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知&#xff0c;在Spring Boot框架中&#xff0c;Controller层API接口编码获取请求体参数时&#xff0c;在参数上会使用RequestBody注解&#xff1b;如果一次请求中&#xff0c;请求体参数携带的内容需要用多个参数接收时&#xff0c;能不能多次使用RequestBody…

跟我学java|Stream流式编程——并行流

什么是并行流 并行流是 Java 8 Stream API 中的一个特性。它可以将一个流的操作在多个线程上并行执行&#xff0c;以提高处理大量数据时的性能。 在传统的顺序流中&#xff0c;所有的操作都是在单个线程上按照顺序执行的。而并行流则会将流的元素分成多个小块&#xff0c;并在多…

微信小程序 全局配置||微信小程序 页面配置||微信小程序 sitemap配置

全局配置 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。 以下是一个包含了部分常用配置选项的 app.json &#xff1a; {"pages": ["pages/index/index",&q…

十五.流程控制与游标

流程控制与游标 1.流程控制1.1分支结构之IF1.2分支结构值CASE1.3循环结构之LOOP1.4循环结构之WHILE1.5循环结构之REPEAT1.6跳转语句之LEAVE语句1.7跳转语句之ITERATE语句 2.游标2.1什么是游标2.2使用游标步骤4.3举例4.5小结 1.流程控制 解决复杂问题不可能通过一个 SQL 语句完…

C# Winform翻牌子记忆小游戏

效果 源码 新建一个winform项目命名为Matching Game&#xff0c;选用.net core 6框架 并把Form1.cs代码修改为 using Timer System.Windows.Forms.Timer;namespace Matching_Game {public partial class Form1 : Form{private const int row 4;private const int col 4;p…

简单介绍JDK、JRE、JVM三者区别

简单介绍JDK vs JRE vs JVM三者区别 文编|JavaBuild 哈喽&#xff0c;大家好呀&#xff01;我是JavaBuild&#xff0c;以后可以喊我鸟哥&#xff0c;嘿嘿&#xff01;俺滴座右铭是不在沉默中爆发&#xff0c;就在沉默中灭亡&#xff0c;一起加油学习&#xff0c;珍惜现在来之不…

【samba】Ubuntu20.04安装 error255解决方法

目录 使用samba报错 net usershare returned error 255时&#xff08;如下图&#xff09;解决方法如下&#xff1a; 1、安装 Samba 服务&#xff1a; 2、配置 Samba 共享&#xff1a; 3、设置 Samba 用户密码&#xff1a; 4、重启 Samba 服务&#xff1a; 6、在 Windows 上…

mysql 下载和安装和修改MYSQL8.0 数据库存储文件的路径

一、第一步:下载步骤 下载链接&#xff1a;MySQL :: Download MySQL Installer 选择版本8.0.35&#xff0c;社区版&#xff0c; 点击 Download 下载 安装包 二、第二步:安装步骤 添加环境变量&#xff0c;C:\Program Files\MySQL\MySQL Server 8.0\bin 可以点开MySQL 8.0 Co…

C++基础1

一、形参带默认值的函数 二、inline内联函数 内联函数是一种在编译器处理时&#xff0c;将函数的实际代码插入到调用处的方法。通常&#xff0c;函数调用涉及一定的开销&#xff0c;包括保存和恢复调用现场、跳转到函数的代码位置等。而内联函数通过在调用处直接插入函数的代码…

Centos7安装K8S

Centos7安装K8S 安装过程中没有出现的错误可以往下 根据以前一些博主写的博客&#xff0c;在小阳翻了不下几十篇博客之后&#xff0c;我果断是放弃了&#xff0c;于是找到了官网地址&#xff0c;然后也有坑 1. 关闭防火墙 systemctl stop firewalld systemctl disable firew…

MySQL的各种日志

目录 一、错误日志 二、二进制日志 1、介绍 2、作用 3、相关信息 4、日志格式 5、查看二进制文件 6、二进制日志文件删除 三、查询日志 四、慢日志 一、错误日志 记录MySQL在启动和停止时&#xff0c;以及服务器运行过程中发生的严重错误的相关信息&#xff0c;当数据库…

Hive使用shell调用命令行特殊字符处理

1.场景分析 数据处理常用hive -e的方式&#xff0c;通过脚本操作数仓&#xff0c;过程中常常遇到特殊字符的处理&#xff0c;如单双引号、反斜杠、换行符等&#xff0c;现将特殊字符用法总结使用如下&#xff0c;可直接引用&#xff0c;避免自行测试的繁琐。 2.特殊字符处理 …

16.桥接模式

桥接模式 介绍 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合的方式来实现&#xff0c;而不是继承。桥接模式通过将抽象和实现解耦&#xff0c;从而实现抽象和实现的分离&#xff0c;使得系统更加…