96SEO 2026-02-20 04:31 3
sort()方法是List本身就有的主要用来排序list.sort((p1,

p2.getAge());System.out.println(list);}DataAllArgsConstructorstatic
[MethodReferenceTest.Person(age19),
MethodReferenceTest.Person(age18),
MethodReferenceTest.Person(age20)]
[MethodReferenceTest.Person(age18),
MethodReferenceTest.Person(age19),
MethodReferenceTest.Person(age20)]
改动2既然Person内部有个逻辑一样的方法就用它来替换Lambdalist.sort(Person::compare);System.out.println(list);}DataAllArgsConstructorstatic
改动1新增一个方法逻辑和之前案例的Lambda表达式相同public
o2.length();}};compareString(str1,
方式2过渡为Lambda表达式ComparatorString
s2.length();};compareString(str1,
方式2的改进版省去赋值操作直接把整个Lambda表达式作为参数丢进去compareString(str1,
方式2的最终版把变量类型和return也去掉了因为Java可以自动推断compareString(str1,
方式3换种比较方式本质和方式2是一样的不信你去看看String#compareTo()ComparatorString
方式4IDEA提示有改进的写法最终变成了方法引用compareString(str1,
{System.out.println(comparator.compare(str1,
很多初学者肯定崩溃了Lambda已经够抽象了好不容易从匿名对象过渡到Lambda怎么又突然冒出String::compareTo这鬼东西
我们在学习Lambda时把它和匿名类作比较。
因为匿名类和Lambda处理的逻辑是一样的所以就用Lambda简化了匿名类
同样的如果项目中已经定义了相同逻辑的方法我们为什么还要再写一遍呢即使Lambda表达式再怎么简洁终究还是要手写好几行代码。
所以JDK在Lambda表达式的基础上又提出了方法引用的概念允许我们复用当前项目或JDK源码中已经存在的且逻辑相同的方法。
String::compareTo看起来形式有点诡异但这只是一种语法而已习惯就好了关键是明白它代表什么意思。
Java8引入::符号用来表示方法引用。
所谓的方法引用就是把方法搬过来使用。
那么String::compareTo把哪个类的什么方法搬过来了呢
一般来说String类定义的compareTo方法的正常使用方式是这样的
作为更高阶的Lambda表达式方法引用也能作为参数传递于是就有了
str.compareTo(anotherStr);}};//
方法引用。
上面的str.compareTo(anotherStr)不就是String::compareTo吗ComparatorString
String::compareTo;compareString(str,
{System.out.println(comparator.compare(str1,
兄弟如果已经存在某个方法能完成你的需求那么你连Lambda表达式都别写了直接引用这个方法吧。
对初学者而言Lambda表达式语义更清晰、更好理解Lambda表达式细粒度更小能完成更精细的需求
本次测试的目的旨在说明Lambda毕竟是手写的自由度和细粒度要高于方法引用。
**
3.MyInteger#compare()的方法体和上面的Lambda表达式逻辑相同可以直接引用MyPredict
MyInteger::compare;myPredict3.test(1,
4.Lambda说你想模仿我想得美老子要DIY一下比较规则a减b
???没法DIYMyInteger::compare是把整个方法搬过来不能修改内部的逻辑}
方法引用其实就是把现成的某个方法拿来替代逻辑相似的Lambda表达式。
说明Lambda逻辑已经变了此时原先的方法引用就不匹配了不能再用了。
此时我们最自然的想法应该是从现成的项目中找到逻辑和(a,
0相同的另一个方法然后把那个方法引用过来而不是想着改变原来的MyInteger::Compare那不是你的方法你也只是借用而已
MyInteger::compare;myPredict3.test(1,
MyInteger::anotherCompare的逻辑和上面的Lambda才是匹配的MyPredict
MyInteger::anotherCompare;myPredict5.test(1,
filter此时需要的逻辑是年龄大于等于30岁的teacher。
你能从现有项目中找到逻辑为“年龄大于等于30岁的teacher”的方法吗
你最多只能调用Teacher::getAge()但是这个方法引用的逻辑是“获取老师的年龄”而不是“是否大于等于30岁”两者逻辑不同无法替换。
首先filter()的参数要么是Lambda表达式要么是方法引用不能是方法引用语句不伦不类。
处理办法也简单就是找一个相同逻辑的方法并引用它。
假设存在以下方法
list.stream().filter(Teacher::isBiggerThan30);
静态方法引用Integer::compare实例方法引用this::getName、user::getName构造器方法引用User::new
总体来说方法引用包括构造器引用的前提是函数式接口的方法对应的参数列表和返回值
下面4个语句都是Person::new却能赋值给不同的函数式接口//
原因是每个函数式接口都能从Person类中找到对应的方法参数列表一致从而完成方法引用PersonCreatorNoConstruct
大家可以尝试把Person中Age构造函数注释那么下面的赋值语句会提示错误因为此时不存在只有一个age参数的构造器PersonCreatorWithAge
Person::new;PersonCreatorWithName
Person::new;PersonCreatorAllConstruct
}但无论是方法引用还是构造器引用都是细枝末节的东西本质上学习好Lambda表达式即可。
我对方法引用/构造器引用的态度就一个如果我的代码不是最优让IDEA提醒我便是我反正是懒得记~
作者简介大家好我是smart哥前中兴通讯、美团架构师现某互联网公司CTO
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback