Java8:复合Lambda 表达式

死磕Lambda表达式(五):Comparator复合 给岁月以文明,而不是给文明以岁月。——《三体》 在上一篇文章(传送门)中介绍了JDK为我们提供的常用函数式接口,JDK不仅提供的这些函数式接口,其中一些接口还为我们提供了实用的默认方法,这次我们来介绍一下Comparator复合。 Comparator的使用 在之前文章的例子中,我们使用Comparator.comparing静态方法构建了一个Comparator接口的实例,我们再来简单介绍一下。先来看一下Mask类是怎么写的: package one.more.study; /** * 口罩 * @author 万猫学社 */ public class Mask { publi 立即下载

Java 8的好几个函数式接口都有为方便而设计的方法。具体而言,许多函数式接口,比如用于传递Lambda表达式的Comparator、Function和Predicate都提供了允许你进行复合的方法。

这是什么意思呢?在实践中,这意味着你可以把多个简单的Lambda复合成复杂的表达式。比如,你可以让两个谓词之间做一个or操作,组合成一个更大的谓词。而且,你还可以让一个函数的结果成为另一个函数的输入。

1.比较器的复合

我们前面看到,你可以使用静态方法Comparator.comparing,根据提取用于比较的键值的Function来返回一个Comparator,如下所示:

Comparator<Apple> c = Comparator.comparing(Apple::getWeight);

1.1 逆序

如果你想要对苹果按重量递减排序怎么办?用不着去建立另一个Comparator的实例。接口有一个默认方法reversed可以使给定的比较器逆序。因此仍然用开始的那个比较器,只要修改一下前一个例子就可以对苹果按重量递减排序:

// 按重量递减排序
inventory.sort(comparing(Apple::getWeight).reversed());

2. 1 比较器链

如果发现有两个苹果一样重怎么办?哪个苹果应该排在前面呢?你可能
需要再提供一个Comparator来进一步定义这个比较。比如,在按重量比较两个苹果之后,你可能想要按原产国排序。thenComparing方法就是做这个用的。它接受一个函数作为参数(就像comparing方法一样),如果两个对象用第一个Comparator比较之后是一样的,就提供第二个Comparator。你又可以优雅地解决这个问题了:

// 先按重量递减排序,如果两个苹果一样重的时候,进一步按照国家排序
inventory.sort(comparing(Apple::getWeight)
.reversed()
.thenComparing(Apple::getCountry));

2. 谓词复合

谓词接口包括三个方法:negate、and和or,让你可以重用已有的Predicate来创建更复杂的谓词。
比如,你可以使用negate方法来返回一个Predicate的非,比如苹果不是红的:

// 产生现有Predicate对象redApple的非
Predicate<Apple> notRedApple = redApple.negate();

你可能想要把两个Lambda用and方法组合起来,比如一个苹果既是红色又比较重:

// 链接两个谓词来生成另一个Predicate对象
Predicate<Apple> redAndHeavyApple =redApple.and(a -> a.getWeight() > 150);

你可以进一步组合谓词,表达要么是重(150克以上)的红苹果,要么是绿苹果:

Predicate<Apple> redAndHeavyAppleOrGreen =
                        redApple.and(a -> a.getWeight() > 150)
                                .or(a -> "green".equals(a.getColor()));

这一点为什么很好呢?从简单Lambda表达式出发,你可以构建更复杂的表达式,但读起来仍然和问题的陈述差不多!请注意,and和or方法是按照在表达式链中的位置,从左向右确定优先级的。因此,a.or(b).and(c)可以看作(a || b) && c。

Java8动态生成SFunction:基于字段名的Lambda表达式实践 本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。 阅读详情

相关推荐

iPhone用户必看:不装App也能搞定GitHub 2FA验证的3种方法(附恢复码管理技巧)

本文为iPhone用户提供了无需安装第三方App即可完成GitHub双重身份验证(2FA)的三种原生方案:利用相机扫码与iCloud钥匙串自动填充、使用iCloud钥匙串内置的TOTP验证码生成器,以及借助Safari浏览器扩展。文章详细解析了每种方法的操作步骤、适用场景,并重点强调了恢复码的安全管理与多层备份策略,帮助开发者在提升账户安全的同时,享受苹果生态的无缝便捷体验。

weixin_29324401的博客 654

Java中lambda表达式及其应用

用函数式接口可以干什么呢? Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。具体说来,就是函数式接口一个具体实现的实例。

swadian2008的博客 1377

【宠物识别系统】设计框架

能跑通的 Demo。收集 10,000 张同品种但不同个体的图片。训练ArcFace模型,验证准确率能否达到 99% 以上。搭建Milvus向量数据库。开发移动端 App/小程序。加入“图像质量检测”和“用户反馈纠错”功能。你是更偏向于做软件服务(如寻宠App、保险API),还是做软硬结合的产品(如智能喂食器)?这决定了我们下一步是深挖云端高并发架构,还是边缘端模型压缩。更偏向于软件,应用更广泛些,继续既然专注于纯软件/SaaS (Software as a Service) 方向。

百态·数智思维 | 聚焦大数据、量化与未来AI 1414

java8实战读书笔记:复合Lambda表达式,面试问了一堆源码、微服务、分布式、Redis

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

jiameih的博客 1038

是德频谱分析仪相位噪声测量实战指南:从原理到精准操作

本文详细介绍了是德频谱分析仪在相位噪声测量中的实战操作指南,从基础概念到高级技巧全面解析。通过5G基站时钟测量等实际案例,展示如何利用是德N9030B等设备精准测量相位噪声,并分享设备预热、参数设置、环境干扰排除等关键操作要点,帮助工程师提升测量精度和效率。

jenkins8butler的博客 229

SolidWorks有限元分析流程

对于很多专业,在进行设计完成后,为了缩短开发周期,往往需要配合仿真结果进行,机械行业更是如此。平时大家多采用专业有限元仿真软件进行仿真分析,如ANSYS;不过SolidWorks软件因为制图简单,同时存在专用的有限元仿真模块Simulation,对于初学者往往更加适用,下面简单介绍下SolidWorks Simulation仿真流程。 1. 分析流程 关键步骤如下: **(1)创建算例;**对模型的每次分析都是一个算例,一个模型可以包含多个算例。 **(2)应用材料;**指定模型的材料属性,如铝合金、钢材等

DYH_BK的博客 3万+

读书笔记——《Java 8实战》系列之复合Lambda表达式

在上一篇博客中我们一起学习了使用方法引用的方式来重复使用现有的方法并直接传递它们,方法引用能够进一步地简化我们的Lambda表达式。在实际问题的处理中,有时候我们需要多个Lambda表达式同时进行工作,Java 同样允许我们将多个简单的Lambda表达式复合成一个更复杂,完成功能更多的复杂表达式。

Jesmin的优快云博客 764

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

3.8 复合Lambda表达式的有用方法

你可以写很多小的组件然后把它们组合起来,形成不同的功能,可以让你的程序变得更加灵活。注意这里的运算顺序是从左至右的,不存优先级这个概念了。接口所代表的Lambda表达式复合起来,,让你可以重用已有的。来创建更复杂的谓词。

StarPlatinum2的博客 381

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1533

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

lambda表达式分享

Lambda的类型是从使用Lambda的上下文推断出来的。上下文(比如,接受它传递的方法的参数,或接受它的值的局部变量)中Lambda表达式需要的类型称为目标类型。因此,装箱后的值需要更多的内存,并需要额外的内存搜索来获取被包裹的原始值。1、必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)(这一点跟Java是强类型语言吻合)。2、Lambda表达式另一个依据是类型推断机制,在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。而局部变量则是保存在栈上的,是线程不共享的。

weixin_43675252的博客 979

AI漫剧全套万能提示词合集

今天给大家整理一套已经跑通爆款漫剧的万能提示词库!覆盖:豆包剧本人设词 + 分镜生成词 + 即梦绘图词 + 动态优化词 + 防翻车固定词直接复制粘贴,新手也能做出稳定、高清、统一、有质感的AI漫剧!你是资深短视频漫剧编剧,擅长制作60秒竖屏爆款AI漫剧,请为我创作一集完整漫剧内容。要求:开头3秒高能抓眼,中段有冲突转折,结尾留强悬念钩子,节奏紧凑、适合短视频流量。首先生成固定统一人物人设:包含脸型、五官、发色、发型、穿搭、身材、气质、画风、光影细节,要求足够精细,保证全程角色不变脸。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1892

java8实战读书笔记:复合Lambda表达式

本文详细介绍复合lambda表达式的使用,主要包含比较器复合、谓词复合、函数复合这三种常用用法。

中间件兴趣圈 1693

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java 8:复合Lambda表达式

发现了Lambda表达式比较有意思的事情,有的Lambda表达式居然可以组合起来使用。例如Comparator, Function 和 Predicate 提供了复合的方法。 Comparator 如果要把一群人按照年龄进行排序,那么可以这样做 personList.sort(Comparator.comparing(Person::getAge)); 但是如果年龄一样的人如何排序呢,可以再按照名字进行排序 personList.sort(Comparator.comparing(Person::getA

不惜留恋_ 375

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 复合方法_《Java 8 实战》Ch3: Lambda表达式(下):类型与限制、方法引用、复合...

李文轩 2019-04-233.5 类型的检查和判断;变量捕获限制类型检查Lambda的类型是从使用Lambda的上下文推断出来的。Lambda表达式需要的类型称为目标类型 。Lambda表达式的类型检查的过程//MainList heavierThan150g = filter(inventory, (Apple a) -> a.getWeight() > 150);//Lambda...

weixin_39669769的博客 155

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java8专题三(下)《Lambda表达式-复合Lambda表达式》

目录 1、复合Lambda表达式的有用方法 1)比较器复合 2)谓词复合 3)函数复合 2、小结 1、复合Lambda表达式的有用方法 Java8的好几个函数式接口都有为方便而设计的方法。比如用于传递Lambda表达式Comparator、Function和Predicate都提供了允许你进行复合的方法。比如,你可以让两个谓词之间做个or操作,组合成一个更大的谓词,你还可以让一个函数...

李静静 391

lambda 操作集合_Java8 之一万字的Lambda表达式的详细介绍与应用案例

基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1 Lambda的概述2 函数式接口2.1 Consumer消费型接口2.2 Supplier供给型接口2.3 Function< T, R >函数型接口2.4 Predicate断言型接口2.5 其他接口以及功能3 Lambda的语法3.1 具体格式3.2 ...

weixin_29751415的博客 356

Comparator.comparing()比较排序(可以jdk8 Strim()结合) 可以通过这个比较排序

Comparator.comparing()比较排序(可以jdk8 Strim()结合) 可以通过这个比较排序

weixin_48212105的博客 6769

Java8—Lambda表达式、方法引用、默认方法的详细介绍【一万字】

基于Java8详细介绍了Lambda表达式的语法与使用,以及方法引用、函数式接口、Lambda复合等Java8的新特性!

终生学习践行者 7819

Java 8 - 07 复合 Lambda 表达式

文章目录PreComparator逆序 reversed()比较器链谓词复合 Pre 前面几个我们使用lambda表达式,都用的是默认的抽象方法,还记得不? 事实上,许多函数式接口,比如用于传递Lambda表达式的 Comparator 、 Function 和 Predicate 都提供了允许你进行复合的方法 这些函数接口中的其他方法(default方法或者static方法) 有啥用呢? 在实际使用场景中,可以把多个简单的Lambda复合成复杂的表达式。 比如 可以让两个谓词之间做一个 or 操

小工匠 2万+

Java 8 Lambda表达式详解:从入门到实践

Lambda表达式的引入,是Java语言发展的一个重要里程碑。它不仅使Java代码更简洁、更易读,还为Java带来了函数式编程的强大能力。Lambda表达式与Stream API(后续章节将详细介绍)的结合,更是开启了Java集合处理的新篇章。

weixin_44283682的博客 3292

java8-06-lambda 复合使用

文章目录复合Lambda 表达式的有用方法比较器复合A.逆序B.比较器链谓词复合negateandor函数复合andThencompose实际使用参考资料目录导航 复合Lambda 表达式的有用方法 Java8的好几个函数式接口都有为方便而设计的方法。具体而言,许多函数式接口,比如用于传递Lambda表达式的Comparator、Function和Predicate都提供了允许你进行复合的方法。 ...

1万+

java8中的lambda表达式,看这篇就够了

Lambda表达式 Lambda是简洁的标识可传递匿名函数的一种方式。“互动”事件驱动下,最终面向对象编程和函数式编程结合才是趋势。 java中,一段代码的传递并不容易。因为JAVA是面向对象的语言,如果要传递一段代码,必须先构建类,再生成对应的对象来传递所要的代码。在之前,JAVA的设计者都抗拒加入这一特性,虽然JAVA现有的特性也能通过类和对象实现类似的API但是这样复杂且不易于使用。在后期,问题早已不是JAVA是不是要变成一门使用函数式编程的语言,而是如何实现这种改变。在java8之前已经有了多年的实

不会骑摩托的程序员不是好的摄影师 2万+

【Java 8】一篇搞定Lambda表达式——Lambda表达式详解与使用

——整理自《Java 8 实战》

vilavin的博客 2578

一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函数式接口抽象方法后,还可以再次调用接口的其它方法,因为从Java8开始,接口中可以包含默认实现的方法。关于接口默认实现方法将会在后面章节详细阐述。 常见的复合Lambda常见的有以...

axe的专栏 847
上一篇: Java8:Lambda简单实战
下一篇: 随笔:如何学习一门新技术
SunTree_X
博客等级 码龄10年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值