最新要闻
- 当前热点-灵感来自微信:微软计划开发一站式“超级应用”
- 环球即时看!惊险!SUV被货车顶上铁轨 火车驶来瞬间逃离
- 玩家们都嫌太贵!曝英伟达考虑将RTX 4080降价
- 世界讯息:AI生成裸照谁之过?真相恐怕和你想的不一样
- 3小时超值!《阿凡达2》电影票价普遍低于50元 IMAX版80元
- “抽烟哥”红到国外 田协紧急倡议应积极正向:全马冲进3个半小时是狠人
- 世界百事通!RTX 4080全球销售疲软:太贵了我再等等
- 《阿凡达2》伦敦首映式
- 惊险一幕!后车记录仪拍下特斯拉失控瞬间 网友分析司机被特斯拉辅助“救”两次
- 今日大雪:仲冬时节正式开始 全国大部气温回升雨雪稀少
- 每日观察!《原神》3.3版本今日上线:风元素新角色来了 还有原石可领
- 葡萄牙6-1大胜瑞士 C罗31场首发终结:加练千个西班牙点球大战仍出局 连续三届无缘8强
- 看齐QQ音乐?Apple Music新功能来了:支持iPhone、iPad唱卡拉OK
- 安兔兔11月iOS设备好评榜出炉:iPhone 14全系未上榜
- 世界今亮点!不止是中药 连花清瘟新专利来了 可用于制作口罩、内衣、防护服等
- 时讯:200元耳机降噪效果比肩2000元!贝壳王子MO3 2代上手:同价位天花板
手机
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
票房这么火爆,如何请视障人士“看”一场电影?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
- 票房这么火爆,如何请视障人士“看”一场电影?
家电
热头条丨JAVA8 函数式编程(1)- Lambda表达式
aliases: [JAVA Lambda]tags : " #Java "summary: [如何使用函数式编程写出优雅高效的JAVA代码]author : [yaenli]date : [2022-11-10]
1 简介
简洁的代码就能处理大型数据集合,让复杂的集合处理算法高效的运行在多核CPU上。
(相关资料图)
面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象,能编写出更易读的代码——这种代码更多地表达了业务逻辑的意图,而不是它的实现机制。
写回调函数和事件处理程序时,程序员不必再纠缠于匿名内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单。能将函数方便地传递也让编写惰性代码变得容易,惰性代码在真正需要时才初始化变量的值。
函数式编程核心思想:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。
2 Lambda 表达式
2.1 Lambda 表达式的基本形式
例2-1:使用匿名内部类将行为和按钮单击进行关联
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("button clicked"); }});
这是一个代码即数据的例子,给按钮传递了代表某种行为的对象。设计匿名内部类的目的,就是为了方便 Java 程序员将代码作为数据传递。
例2-2:使用 Lambda 表达式将行为和按钮单击进行关联
button.addActionListener(event -> System.out.println("button clicked"));
Lambda 特点
- 传入了一段代码块(无名函数),event是参数名,
->
将参数和主体分开。 - 声明 event 参数的方式,匿名内部类需要显示声明参数类型,而 Lambda 表达式中无需指定类型,程序依然可以编译。这是因为 javac 根据程序的上下文( addActionListener 方法的签名)在后台推断出了参数 event 的类型。这意味着如果参数类型不言而明,则无需显式指定。
Java 仍然是一种静态类型语言。声明参数时也可以包括类型信息,而且有时编译器不一定能根据上下文推断出参数的类型!
2.2 Lambda 表达式的变种
例2-3:Lambda 表达式的不同形式
// 1 不含参数,且返回类型为voidRunnable noArguments = () -> System.out.println("Hello World"); // 2 一个参数,可省略括号ActionListener oneArgument = event -> System.out.println("button clicked"); // 3 主体不仅可以是表达式,也可以是代码块{},块中可以返回或抛异常Runnable multiStatement = () -> { System.out.print("Hello");System.out.println(" World");};// 4 创建了一个函数,用来计算两个数字相加的结果。变量 add 的类型是 BinaryOperator ,它不是两个数字的和,而是将两个数字相加的那行代码。BinaryOperator add = (x, y) -> x + y; // 5 需要显示声明参数类型时,用()BinaryOperator addExplicit = (Long x, Long y) -> x + y;
目标类型
是指 Lambda 表达式的类型,依赖于上下文环境,由编译器推断而来。比如,将 Lambda 表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是 Lambda 表达式的目标类型。Java 中初始化数组时,数组的类型就是根据上下文推断出来的。另一个常见的例子是 null ,只有将 null 赋值给一个变量,才能知道它的类型。
2.3 Lambda 的引用类型
Lambda 表达式引用的是值,而不是变量。
Lambda 和匿名内部类一样,在引用外部变量时,该变量必须是终态变量。如下是正确和错误示例:
例2-4:Lambda 表达式中引用既成事实上的 final 变量
// 编译通过String name = getUserName(); // final变量button.addActionListener(event -> System.out.println("hi " + name));// 编译错误String name = getUserName();name = formatUserName(name); // 非终态变量button.addActionListener(event -> System.out.println("hi " + name));
Java 8 无需显示声明final,但是该变量必须是既成事实上的终态变量(final),否则编译器会报错。是否显示的使用final,取决于个人喜好。
2.4 Lambda 表达式的类型
Lambda 表达式的类型是函数接口。
函数接口是只有一个抽象方法的接口.
例2-5: ActionListener 接口
public interface ActionListener extends EventListener {public void actionPerformed(ActionEvent event);}
ActionListener 就是一个函数接口,actionPerformed 定义在一个接口里,因此 abstract 关键字不是必需的。该接口也继承自一个不具有任何方法的父接口: EventListener 。
接口中单一方法的命名并不重要,只要方法签名和 Lambda 表达式的类型匹配即可。
表2-1:JDK8 中重要的函数接口
接口 | 参数 | 返回类型 |
---|---|---|
Predicate | T | boolean |
Consumer | T | void |
Function | T | R |
Supplier | None | T |
UnaryOperator | T | T |
BinaryOperator | (T, T) | T |
2.5 Lambda 表达式的类型推断
Lambda 表达式中的类型推断,实际上是 Java 7 就引入的目标类型推断的扩展。
例2-6:使用菱形操作符,根据变量类型做推断
Map diamondWordCounts = new HashMap<>();
如果将构造函数直接传递给一个方法,也可根据方法签名来推断类型。
例2-7:使用菱形操作符,根据方法签名做推断
useHashmap(new HashMap<>());...private void useHashmap(Map values);
Java 8 中对类型推断系统做了提升。上面的例子将 new HashMap<>()传给 useHashmap 方法,即使编译器拥有足够的信息,也无法在 Java 7 中通过编译。
类型推断:JAVA8中,程序员可省略 Lambda 表达式中的所有参数类型。javac 根据 Lambda 表达式上下文信息就能推断出参数的正确类型。程序依然要经过类型检查来保证运行的安全性,但不用再显式声明类型。
例2-8:Predicate类型推断
// Predicate 接口的源码,接受一个对象,返回一个布尔值public interface Predicate {boolean test(T t);}// x被推断为Integer, javac 还检查Lambda 表达式的返回值是不是 booleanPredicate atLeast5 = x -> x > 5;
例2-9:BinaryOperator类型推断
// BinaryOperator 接口源码,接受两个对象,返回一个对象,泛型参数既是入参类型,也是返回类型public interface BinaryOperator extends BiFunction {}public interface BiFunction { R apply(T t, U u);}// x,y推断为Long,并返回LongBinaryOperator addLongs = (x, y) -> x + y;// 以下代码编译报错:Operator "& #x002B;" cannot be applied to java.lang.Object, java.lang.Object. 没有给出add的泛型信息,编译器认为都是Object。BinaryOperator add = (x, y) -> x + y;
2.6 总结
- Lambda 表达式是一个匿名方法,将行为像数据一样进行传递。
- Lambda 表达式的常见结构:
BinaryOperator
。add = (x, y) → x + y - Lambda 表达式的类型是函数接口,指仅具有单个抽象方法的接口。
练习:使用 ThreadLocal 创建一个线程安全的 DateFormatter 对象
ThreadLocal 作为容器保存当前线程的局部变量,JAVA8 中新增了工厂方法,可以不用再使用继承;DateFormatter 非线程安全
public class JavaMainTest {private static ThreadLocal threadLocal;private void init() {// jdk7threadLocal = new DataFormatThreadLocal() ;// jdk8threadLocal = ThreadLocal.withInitial(new Supplier() {@Overridepublic SimpleDateFormat get() {return new SimpleDateFormat("yyyy-MM-dd");}});// jdk8 lambdathreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));}class DataFormatThreadLocal extends ThreadLocal {@Overrideprotected SimpleDateFormat initialValue() {// TODO Auto-generated method stubreturn new SimpleDateFormat("yyyy-MM-dd");}}}
3 参考资料
《Java 8函数式编程》- 作者:[英]沃伯顿;译者:王群锋
-
易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究
易基因|m6A去甲基化酶ALKBH5通过降低PHF20mRNA甲基化抑制结直肠癌进展& 160;|肿瘤研究大家好,这里是...
来源: 热头条丨JAVA8 函数式编程(1)- Lambda表达式
易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究
焦点日报:火山引擎 DataTester:如何用 A/B 测试做产品增长?
WTM+InfluxDB时序数据库数据查询并放到DataTable中
中科慧政 & JNPF :全面开启智慧政务,灵活满足政务办公需求
【焦点热闻】南墙WAF-最好的免费Web应用防火墙
天天关注:高光时刻 | 方正璞华联合开发的「人力资源法律服务共享平台」在创新创业大赛中获奖
全球新消息丨95年属猪的2019年运势
【环球热闻】绳责的意思(绳责)
天天动态:水滴筹标题范文(水滴筹标题怎么写)
今头条!应用昆虫学(应用昆虫学报)
环球头条:工厂找哪个网站?
焦点信息:促排卵期间注意哪些事项(促排卵期间注意事项)
天天资讯:越南旅游签证办理流程及费用(越南旅游签证办理流程)
全球快报:空鼻症是什么样(空鼻症是什么病)
【天天新视野】电脑桌面怎么恢复到原来的样子(电脑桌面怎么恢复到原来的样子)
每日信息:闲鱼卖二手
微资讯!西藏万隆虫草鹿鞭王
环球观焦点:77电玩城(77dizhi)
热头条丨低温性能革命性进步!宁德时代:钠电池有望装车500公里续航车型
当前播报:非典是哪一年一共死多少人(非典是哪一年)
天天热讯:空调显示屏上显示df是什么意思(空调运行中显示屏出现字母df是什么意思)
全球报道:我国现存新能源汽车相关企业56.8万家,仅2021年新增17万家
全球要闻:日本电子巨头罗姆将量产下一代半导体:提高用电效率、增加电动车续航里程
环球今日报丨传感器和处理器如何打造更智能、更自主的机器人?
世界即时:如何实现工业自动化?传感器对于工业自动化有什么样的意义
天天新动态:工业自动化如何实现?
当前焦点!使用cpolar(内网穿透)最低成本搭建网站
如何在Windows AD域中驻留ACL后门
当前热点-灵感来自微信:微软计划开发一站式“超级应用”
环球即时看!惊险!SUV被货车顶上铁轨 火车驶来瞬间逃离
玩家们都嫌太贵!曝英伟达考虑将RTX 4080降价
世界讯息:AI生成裸照谁之过?真相恐怕和你想的不一样
3小时超值!《阿凡达2》电影票价普遍低于50元 IMAX版80元
Redis 的 keys 命令你知道有多慢吗?
“抽烟哥”红到国外 田协紧急倡议应积极正向:全马冲进3个半小时是狠人
世界百事通!RTX 4080全球销售疲软:太贵了我再等等
《阿凡达2》伦敦首映式
惊险一幕!后车记录仪拍下特斯拉失控瞬间 网友分析司机被特斯拉辅助“救”两次
今日大雪:仲冬时节正式开始 全国大部气温回升雨雪稀少
每日观察!《原神》3.3版本今日上线:风元素新角色来了 还有原石可领
葡萄牙6-1大胜瑞士 C罗31场首发终结:加练千个西班牙点球大战仍出局 连续三届无缘8强
看齐QQ音乐?Apple Music新功能来了:支持iPhone、iPad唱卡拉OK
安兔兔11月iOS设备好评榜出炉:iPhone 14全系未上榜
SpringBoot构建RESTful风格应用
环球速讯:Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
全球最新:npm或者yarn安装sharp太慢、失败等问题
世界今亮点!不止是中药 连花清瘟新专利来了 可用于制作口罩、内衣、防护服等
时讯:200元耳机降噪效果比肩2000元!贝壳王子MO3 2代上手:同价位天花板
全国单日票房一度超4000万元:《阿凡达2》万众期待
热门:快升级5G!明年4G网速体验更糟糕:原因很无解
54年了!波音747飞机正式停产 一记录保持37年
焦点播报:MAUI新生3.4-深入理解XAML:数据模板DataTemplate
环球观热点:生成器函数
当前视点!Kubernetes configmap 笔记
画家要失业了?PS母公司Adobe开卖AI图片:侵权赔偿也自己扛
为什么海底火山不会被海水浇灭?
Javascript-极速入门指南-2-BOM与DOM操作-jQuery简介
54个CSS重难点整理,12-24篇,进阶高薪必需要掌握的知识点
国产CPU与国产OS联合 阿里平头哥加入openKylin社区
男子iPhone 13 Pro不到三个月自燃 法院:商品不符合质量要求 可以换新
全球热点!java创建线程的唯一方式
第一百一十篇:内存泄漏和垃圾回收(JS)
新资讯:《阿凡达2》获知名制作人小岛秀夫好评点赞:能够让人焕发激情
当前滚动:进军PC配件!一加将推出旗下首款机械键盘
《巫师3》次时代版“史诗升级”:官方Mod工具终于来了
AMD RX 7900又一非公卡亮相:档次上去了
每日热文:女子被绑浇墨汁?官方:自导自演 直播网红为赚流量博人眼球将严惩
left jon连接查询踩坑记
全球观热点:AMD RX 7900首批供货非常紧张!某品牌明年才能有
环球讯息:约4.1万人民币 法国一公司推出氢能电动自行车:像是助力车
环球焦点!一加11渲染图被网友恶搞:辨识度拉满
中国超越德国成全球第二大出口国!比亚迪自建船队引关注
世界快看点丨福建一景区回应多人推山顶“风动石”:重几十吨 风能吹动人推不动它
天天微头条丨没开发人员,接到开发物联网系统的活儿,干不干?
当前快讯:大笔加码越南!三星电子和LG将追加投资数十亿美元建厂
世界观点:惊了!研究发现蚂蚁竟也产奶 难道它也是哺乳动物?
1.7米长 从头裹到脚:洁丽雅加厚加大浴巾29元抄底
天天快播:“售后、周转、维护” 电动自行车换电池“三不要”
环球微动态丨移动端硬件实时光追落地!第二代骁龙8让游戏画面更逼真
快讯:全同态加密是否完美?
力扣刷题03
热门看点:MySQ 8.0 推出直方图,性能大大提升!
记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头
世界视点!浙里办单点登陆、令牌获取用户信息
【全球热闻】iOS开发证书发布证书,推送证书,描述文件的生成总集(一)
世界今热点:AirPods Pro 2立大功!苹果占据31%真无线耳机市场
天天热议:网友吐槽买瓶饮料都要下载APP 网友:是我我扭头就走
全球热点!Chrome更新置顶横幅通知:明确不再支持Win7/8.1平台
环球速看:价格屠夫 小米4K双99%色域专业显示器2399元(首发3499)
天天快播:日本队更衣室留千纸鹤表感谢!国际足联再感谢日本球迷清理看台引热议 高素质
世界快讯:日产回应车机更新显示文案待定:车联网激活才可正常使用
手机端光追将至:Basemark推出首个移动设备光追基准测试
奇瑞汽车站起来了!连续6月销量超10万 破百万辆大关
小太阳取暖忘断电7分钟烧掉整间屋!官方科普冬季电器使用指南
世界焦点!买到运损保时捷女子要求退一赔三!判了:退车4S店再赔20万
焦点快播:吃肉最毁环境、很不环保?国外动物保护主义者抗议肉食让吃素
“不良剧情直播”污人眼球 抖音出手:禁止虚假炒作、已处罚9万多账号
天天热点!醉驾男遇上碰瓷女:给五万要私了嫌贵 结果双双被拘
4比1送走韩国 巴西球员轮流摸罗纳尔多双腿蹭欧气 “小熊”说要继续跳舞直到决赛