JDK8新特性之方法引用
admin
2024-02-07 06:22:55
0

目录

为什么要用方法引用

Lambda表达式冗余

解决方案

方法引用的格式

对象名::方法名

类名::静态方法名

类名::引用实例方法

类名::构造器

数组::构造器


为什么要用方法引用

Lambda表达式冗余

public class methodRefTest {public static void main(String[] args) {printMax(a->{// Lambda表达式中的代码和 getTotal中的代码冗余了int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);});}private static void printMax(Consumer consumer){int[] a= {10,20,30,40,50,60};consumer.accept(a);}/*** 求数组中的所有元素的和* @param a*/public void getTotal(int a[]){int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);}}

解决方案

因为在Lambda表达式中要执行的代码和我们另一个方法中的代码是一样的,这时就没有必要重写一 份逻辑了,这时我们就可以“引用”重复代码

public class methodRefTest {public static void main(String[] args) {printMax(methodRefTest::getTotal);}private static void printMax(Consumer consumer){int[] a= {10,20,30,40,50,60};consumer.accept(a);}/*** 求数组中的所有元素的和* @param a*/public static void getTotal(int a[]){int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);}}

方法引用的格式

符号表示: ::

符号说明:双冒号为方法引用运算符,而它所在的表达式被称为 方法引用

应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法引用。(注意一个小细节,方法引用的时候方法没有括号哦)

常见的引用方式:

  1. instanceName::methodName 对象::方法名
  2. ClassName::staticMethodName 类名::静态方法
  3. ClassName::methodName 类名::普通方法
  4. ClassName::new 类名::new 调用的构造器
  5. TypeName[]::new String[]::new 调用数组的构造器

对象名::方法名

public static void main(String[] args) {Date now = new Date();Supplier supplier1 = ()->{return now.getTime();};System.out.println(supplier1.get());// 然后我们通过 方法引用 的方式来处理Supplier supplier2 = now::getTime;System.out.println(supplier2.get());}

方法引用的注意事项:

  • 被引用的方法,参数要和接口中的抽象方法的参数一样
  • 当接口抽象方法有返回值时,被引用的方法也必须有返回值

类名::静态方法名

public class FunctionRefTest04 {public static void main(String[] args) {Supplier supplier1 = ()->{return System.currentTimeMillis();};System.out.println(supplier1.get());// 通过 方法引用 来实现Supplier supplier2 = System::currentTimeMillis;System.out.println(supplier2.get());}
}

类名::引用实例方法

Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作 为方法的调用者

public class FunctionRefTest05 {public static void main(String[] args) {Function function = (s)->{return s.length();};System.out.println(function.apply("hello"));// 通过方法引用来实现Function function1 = String::length;System.out.println(function1.apply("hahahaha"));BiFunction function2 = String::substring;String msg = function2.apply("HelloWorld", 3);System.out.println(msg);}
}

类名::构造器

public class FunctionRefTest06 {public static void main(String[] args) {Supplier sup = ()->{return new Person();};System.out.println(sup.get());// 然后通过 方法引用来实现Supplier sup1 = Person::new;System.out.println(sup1.get());BiFunction function = Person::new;System.out.println(function.apply("张三",22));}
}

 

数组::构造器

public static void main(String[] args) {Function fun1 = (len)->{return new String[len];};String[] a1 = fun1.apply(3);System.out.println("数组的长度是:" + a1.length);// 方法引用 的方式来调用数组的构造器Function fun2 = String[]::new;String[] a2 = fun2.apply(5);System.out.println("数组的长度是:" + a2.length);
}

相关内容

热门资讯

马斯克成为科技行业“风向标” ... 来源:@投中网微博 【马斯克成为科技行业“风向标” 带火汽车航天光伏三大领域】作为科技行业标杆与全球...
凝“新”聚力│发挥“联”优势 ... 前 言 为深入贯彻落实习近平总书记同全国妇联新一届领导班子成员集体谈话时提出的“加大在新经济组织、新...
【日常消费品ETF收涨约0.8... 【日常消费品ETF收涨约0.8%,领跑美股行业ETF,半导体ETF跌约0.7%,银行业ETF跌超3....
每月最高800元!中度以上失能... 民政部、财政部日前印发通知,从今年1月1日起,面向中度以上失能老年人发放养老服务消费补贴的政策在全国...
龙虎榜揭秘!大牛股背后资金动向... 龙虎榜揭秘。 近期A股市场整体波动较为平稳,但不少个股波动剧烈,甚至连续涨停或连续跌停,近日的龙虎榜...
原创 全... 全球都在用美元? 中国偷偷搞了个大动作! 美元占全球支付50%时人民币干了啥? 你可能不知道的是,当...
我国银行理财市场规模突破33万... 银行业理财登记托管中心1月23日发布的《中国银行业理财市场年度报告(2025年)》显示,截至2025...
最高分红率35%!上市银行春节... 随着春节临近,上市银行2025年中期分红逐渐进入尾声。 1月23日,华夏银行、渝农商行迎来2025年...
蔡英丽医生:帕金森患者麻醉注意... 帕金森病是中老年人常见的神经系统退行性疾病,随着病情进展,不少患者可能需要接受各类手术,而麻醉环节的...
原创 利... 朋友们,今天A股发生了一件挺有意思的事:在地面光伏行业不少公司还在为亏损发愁的时候,一个叫做“太空光...
二游王战之局,鹰角先下一城 2026二游王战的启幕来了。1月22日,鹰角《明日方舟:终末地》(以下简称终末地)正式公测,和我们预...
大润发首次跨界合作蛋仔派对,以... 2026年春节前夕,高鑫零售旗下核心品牌大润发与国民级游戏IP《蛋仔派对》正式达成深度跨界合作,共同...
2025年基金4季报重仓股全扫... 随着基金2025年4季报基本披露完毕,记者注意到,截至去年底,基金的重仓股发生了比较明显的变化,有5...
昔日“疫苗之王”科兴控股大消息... 让科兴控股小股东忐忑两个多月的退市事项,迎来新进展。 1月22日晚间,科兴控股生物技术有限公司(以下...
视频丨“片场”成打卡新去处 解... 最近,多个因电影而火热的城市持续收获关注,并积极筹备春节文旅服务。在河南安阳,电影《封神2》对殷商文...
东方新能源汽车主题混合:202... AI基金东方新能源汽车主题混合(400015)披露2025年四季报,第四季度基金利润8586.66万...
数字人民币生态日趋成熟,服贸会... 2025年中国国际服务贸易交易会(以下简称“服贸会”)正在北京举行。作为服贸会九大专题之一,本届金融...
证监会进一步扩大期货市场开放品... 近日,证监会根据《境外交易者和境外经纪机构从事境内特定品种期货交易管理暂行办法》(证监会令第116号...
医保搭台、产业唱戏 多部委协同... 党的二十届四中全会对“十五五”时期扩大高水平对外开放作出了顶层设计和战略擘画,强调了与世界各国共享机...