范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Lambda表达式之方法引用

  一、前言
  作为一个合格的程序猿,在日常开发过程中我们都是使用一些成熟的解决方案,例如在解决接口中的抽象方法该如何调用时,我们以前普遍采用的是俩种方式:
  1、使用一个类去实现接口,在实现类中重写接口的方法,再创建实现类对象调用重写方法,实现方法调用。
  具体的代码实现如下: 接口定义 public interface IUsb {        void cha(); //默认被public abstract修饰 }实现类 public class UsbImpl implements IUsb {        @Override        public void cha() {               // TODO Auto-generated method stub               System.out.println("实现类");        } } 测试类 public class Test {        public static void main(String[] args) {               UsbImpl u = new UsbImpl();               u.cha();        } }
  2、使用匿名内部类的方式,节省实现类的创建,让jvm帮助我们自动创建实现类对象 匿名内部类        IUsb u1 = new IUsb() {               @Override               public void cha() {                      System.out.println(123);                      }               };               u1.cha(); 特别注意: new IUsb() {               @Override               public void cha() {                      System.out.println(123);                      }               }; 以上代码不是在创建接口的对象,这里只是匿名内部类的语法格式。 接口不存在构造方法,不能创建对象
  但是在实际开发中,我们会发现匿名内部类有点太臃肿,冗余代码较多,代码的可读性不强,所以在jdk1.8的版本中提出了使用lambda表达式来简化匿名内部类。所以在读懂这篇文章之前各位看官一定要熟练掌握lambda表达式的基础语法格式。
  我们今天讲的是在lambda表达式基础上进一步进行简化操作,称之为方法引用。今天先给大家分享几个比较常用的方法。 二、lambda方法引用静态方法引用
  案例1:将用户传入的字符串转换为对应Integer类型 //函数式接口 public interface MyInterface {        //将字符串转换为Integer        public Integer changeInt(String num); } 解决方式: public class Test {        public static void main(String[] args) {               //使用匿名内部类写出来               MyInterface mi = new MyInterface() {                      @Override                      public Integer changeInt(String num) {                                                        return Integer.parseInt(num);                     }               };                           //lambda的简化写法               MyInterface mi = num -> Integer.parseInt(num);            System.out.println(mi.changeInt("123"));               /**            以上代码就是使用lambda表达式简化后的写法,对比匿名内部类的方式可以看出,我们节省了一些冗余代码,只保留最核心的操作。但是在这段代码中我们还可以进一步进行优化操作。就是使用静态方法引用的方式,但它必须满足以下条件才可以。                满足条件:                      1、被引用的静态方法参数列表和函数式接口中抽象方法的参数类型一致!!                             引用的静态方法:static int parseInt(String s)                            接口的抽象方法:Integer changeInt(String num);                      2、接口的抽象方法没有返回值,引用的静态方法可以有返回值也可以没有                       3、接口的抽象方法有返回值,引用的静态方法必须有相同类型的返回值!!                      上面的3个条件只需要同时满足1、2或者1、3就可以              现在就是同时满足条件1和条件3              所以我们可以采用以下语法格式来简化                                                  类名::静态方法名                 */                MyInterface mi = Integer::parseInt;               System.out.println(mi.changeInt("123"));         /*           :: 这个格式通过代码跟踪知道调用的就是接口中的抽象方法changeInt           parseInt 这个方法就是调用Integer类中的静态方法  */        } }
  看完上面的案列之后,我们再来加深一次印象,再实现一个需求来理解静态方法引用
  案例2:比较俩个数的大小 //函数式接口 public interface MyInterface {        //比较俩个数的大小        public Integer getMax(int a,int b); } 测试类: public class Test {        public static void main(String[] args) {               //调用比较大小的方法,使用匿名内部类实现               MyInterface mi = new MyInterface() {                      @Override                      public Integer getMax(int a, int b) {                             return Integer.max(a, b);                      }               };               System.out.println(mi.getMax(10, 20));                       //lambda表达式的简化               MyInterface mi = (a,b)->Integer.max(a, b);               System.out.println(mi.getMax(10, 20));                             //静态方法引用               MyInterface mi = Integer::max;               System.out.println(mi.getMax(10, 20));        } }构造方法引用
  需求:在接口中创建一个抽象方法 用于获取创建的用户对象 用户类 public class User {        String name; //为了简化操作 没有按照标准封装的语法        public User(String name) {               this.name = name;        }        @Override        public String toString() {               return "User [name=" + name + "]";        } } 接口的抽象方法 public interface MyInterface {        //创建一个方法  用于获取对象        public User getUser(String name); }  测试类  public class TestUser {        public static void main(String[] args) {               //使用匿名内部类写出来               MyInterface mi = new MyInterface() {                      @Override                      public User getUser(String name) {                             return new User(name);                      }               };               System.out.println(mi.getUser("gg"));               MyInterface mi = name-> new User(name);               System.out.println(mi.getUser("gg"));                            /**                 * 构造方法引用                 * 语法 :类名::new                       满足条件:                              构造方法与函数式接口的抽象方法参数列表一致                  接口方法:public User getUser(String name);                  构造方法:public User(String name) {}                 */                MyInterface mi = User::new;               System.out.println(mi.getUser("gg"));        } }实例方法引用
  案例1:判断指定的字符串对象是否以指定的后缀结束
  这里我们使用的是java8自带的函数式接口Function public class TestFunction {        public static void main(String[] args) {               /*                 * 使用function接口传入一个字符串 判断是否以指定的后缀结束                 * 泛型的类型必须是引用数据类型                 */               String strs = "xxx和xxxx的故事.mp4";               Functionfun = new Function() {                      @Override                      public Boolean apply(String str) {                             //str 指定的后缀                             return strs.endsWith(str);                      }               };               System.out.println(fun.apply(".avi"));               //lambda表达式的简化方式               String strs = "xxx和xxxx的故事.mp4";               Functionfun = str -> strs.endsWith(str);               System.out.println(fun.apply(".avi"));               /**                 * 语法 :对象名::非静态方法名                       满足条件:                       1、被引用的实例方法参数列表和函数式接口中抽象方法的参数一致!!                                实例方法:boolean endsWith(String suffix)                                 抽象方法:Boolean apply(String str)                       2、接口的抽象方法没有返回值,引用的实例方法可以有返回值也可以没有                       3、接口的抽象方法有返回值,引用的实例方法必须有相同类型的返回值!!                */                String strs = "xxx和xxxx的故事.mp4";               Functionfun = strs::endsWith;               System.out.println(fun.apply(".avi"));        } }
  案例2:获取指定字符串的长度 函数式接口 public interface MyInterface {     //返回指定字符串的长度        public Integer getLength(); }public class TestFunction {        public static void main(String[] args) {                            String strs = "xxx和xxxx的故事.mp4";               MyInterface mi = new MyInterface() {                      @Override                      public Integer getLength() {                             // TODO Auto-generated method stub                             return strs.length();                      }               };         //lambda简化               MyInterface mi = ()-> strs.length();                      //实例方法引用  对象名::实例方法名               MyInterface mi = strs::length;               System.out.println(mi.getLength());        } }特定类型的方法引用
  案例:传入字符串,获取到传入字符串的长度 函数式接口  public interface MyInterface {      //获取到字符串参数的长度               public Integer getLength(String str);  }测试类  MyInterface mi = new MyInterface() {                      @Override                      public Integer getLength(String str) {                             return str.length();                      }               };               System.out.println(mi.getLength("123")); //lambda简化               MyInterface mi = str->str.length();               System.out.println(mi.getLength("123"));               /**               * 特定类型的方法引用                      语法:类名::非静态(实例)方法                      满足条件:                             在抽象方法中,参数作为实例方法调用者,就可以简化               在lambda简化的代码中我们正好是将参数作为length方法的调用者, 在满足这个条件的前提下,就可以使用类名::实例方法的语法来完成特定类型引用。               */               MyInterface mi = String::length;               System.out.println(mi.getLength("123"));三、结语
  以上内容就是给大家简单的总结了一下比较常用的方法引用方式,在初学者第一次接触lambda的方法引用时,不能急躁,需要多通过具体的案例来强化代码认识。
  并且这个方法引用一般还是搭配java8新特性里面的stream流来一起使用,后续会给大家继续补充相关的基础内容。

研究突破人类在700万年前就已经用自己的双脚站立了对现今物种的研究已经对人类在生物世界中的地位做出了明确的判断与黑猩猩和倭黑猩猩并列。然而,这并没有告诉我们很多关于我们最早的人类代表他们的生物学或地理分布简而言之,我们如何成为人类华为Mate50官宣可变光圈镜头iPhone14系列全新紫色引争议华为Mate50系列官宣配可变光圈镜头8月31日,星期三,欢迎收看今天的科技V报,我是龙二Pro,今天一早,华为方面放出重磅消息,正式官宣了即将发布的Mate50系列,将用上传闻已困在下沉市场的新势力第二梯队燃次元(IDchaintruth)原创作者吕敬之曹杨编辑曹杨在刚刚举行的2022年成都国际车展上,新能源汽车成为关注的焦点。一边,是蔚小理为首的造车新势力第一梯队在各自的发布会上亮方星海证监会将持续提升期货市场运行质量继续增加品种供给方星海证监会将持续提升期货市场运行质量继续增加品种供给财联社8月26日电,证监会副主席方星海在第十九届上海衍生品市场论坛上表示,证监会将不断完善法治和品种体系,持续提升期货市场运行未来三年复合年增长率120!京东美的战略合作拓展空调工程市场近年来,商用空调产品作为企业生产经营中不可或缺的设备,已成为企业采购链条中的重要一环,企业对于商用空调的需求也日益飙升。为了更好地拓展空调工程市场,向企业级客户提供更高质量的商用空环球影城大错而特错了翼龙不是恐龙开学前一周,与小朋友去了心仪已久的北京环球影城,玩儿的那叫一个嗨啊,尤其感兴趣的项目侏罗纪世界大冒险,更是令人心旷神怡,该项目就是乘坐着全地形豪华自动系统(ATLAS),进入侏罗纪使用3D打印技术研究蛋白石恐龙化石据宇宙杂志报道,澳大利亚阿德莱德弗林德斯大学的古生物学家使用微型CT扫描和3D打印技术,对1颗蛋白石进行了研究。而这颗蛋白石则大有来头,是1颗1亿年前的恐龙蛋形成的蛋白石化石。20被女帝老婆曝光,才发现我无敌了第1章这高人竟一棍子击败天狼妖王?远江城东边的一条街上有一家简陋的药铺,药铺牌匾上写着时珍铺。叶天龙站在药铺门口,对着门口的一只鹦鹉道小鹦鹉,我要上山采药,看好家,不要让小偷进来,OEPLAY是一款星球形状的高保真扬声器OEPLAYMusicStar5是一个相当大的音频单元,它做出了最终的承诺让你按照艺术家想要的方式听到音乐。MusicStar5配备了高性能AMT高音扬声器和一些令人印象深刻的音频iPhone14即将来了!搭载A15芯片,或将再次刷新纪录随着IPhone14手机发布时间越来越近,很多果粉都比较期待,那么新款苹果手机到底有哪些优势,是否可以和iPhone13相比呢?这一直都是大家比较关注的话题,近期大家在网络上也看到华为Mate50定档9月6日,硬钢iPhone149月8日,华为胜算几何?9月份,手机市场将掀起新一轮高端机市场风暴,华为Mate50系列及全场景新品秋季定档9月6日发布,而仅相隔两天,苹果将于9月8日凌晨1点举行iPhone14新品发布会,这意味着苹果
2002世界杯预选赛大洋洲篇,袋鼠军团狂刷记录,夸张比分难以想象与以往一样,2002年世界杯给到大洋洲的席位还是只有0。5个。大洋洲足联旗下10支球队参加此次预选赛,他们将被分成2个小组,2个小组第一再进行主客场对决,最终的胜者获得这0。5个席辛克尔认为,科贝尔拥有卡恩的风范,阿德耶米要增强足球头脑德国队的前国脚辛克尔评价了欧冠淘汰赛,多特蒙德击败了切尔西,虽然很多人看好蓝军在主场逆转取胜,不过黄黑军团已经占据了主动权。辛克尔认为,科贝尔拥有卡恩的风范,守门员才是本场比赛的关火箭今夏有望通过交易得到的10大球星,重回季后赛不是不可能本西蒙斯本西蒙斯本赛季场均出战27。2分钟,可以得到7。4分6。5篮板6。4助攻1。4抢断,投篮命中率56。6。他今年只有26岁,拥有2。08米的身高,2。14米的臂展以及110公建议用高科技大数据装备介入反腐斗争,提高反腐倡廉治理效率头条创作挑战赛黄赌毒贪四大社会毒瘤,人民群众最痛恨的是贪污腐败。余姚市教育局长王战胜贪腐3个亿!足协主席陈茂源涉案30亿一连串大案要案震惊天下。罗马不是一天建成的,为什么就没有被早CBA球队最新注册球员广东宏远队头条创作挑战赛20222023赛季CBA联赛国内球员注册期为2022年8月1日至8月31日,随着第二阶段比赛的结束,随之来到了CBA的第一个交易窗口期,时间为2023年1月17日至卡塔尔财团收购曼联?球迷千呼万唤的石油爹终于来了2月17日22时,是曼联收购交易第一轮报价的截止日期。目前,卡塔尔主权基金投资局(QIA)被认为是最有可能接手曼联的买家,而英国首富吉姆拉特克利夫爵士是主要竞争者。虽然传闻中来自中狂欢来袭,全明星即将开打!!!率先开战的是NBA星锐挑战赛,本届全明星星锐赛将由4支球队进行3场比赛,NBA球员将被分成3支球队,由NBA球员队教练名宿保罗加索尔,乔金诺阿,德隆威廉姆斯进行选择,发展联盟球员将欧洲被卖了!俄乌冲突,可能都搞错了,俄罗斯成主导美国神助攻二战之后,美国为解决国内产能过剩产能,转而扶持欧洲,实行了马歇尔计划,看似帮欧洲恢复元气,实则是想控制欧洲,为美国产品输出做准备。如今却又把欧洲从俄乌冲突中拖下水,欧洲看似心甘情愿今年春节,上海游客最喜欢去哪里旅游?消费感受如何?调查结果已出2023年春节,旅游业迎来暖冬,消费者旅游需求旺盛,一些热门旅游目的地出现了久违的客流猛增一房难求的火爆场面。那么本次长假出游,消费者的感受究竟如何?旅游服务质量对比3年前是否有所赵丽颖新代言品牌,阿依莲风?英国皇室也喜欢赵丽颖的新代言英国轻奢轻奢品牌,但是官宣图被网友评论阿依莲风。大家来品品,官宣图是下面这样的。以前流行的阿依莲衣服是这样的,大家看看怎么样。说像的应该是都有蝴蝶结元素和粉色系,大家不喜欢串门,也不喜欢别人来自己家,十有八九是这三种人图来自网络,侵权请联系删除你发现了吗?现在的人越来越讨厌串门,也很少再去别人家拜访。我们都是关上房门过着自己的小日子,看起来孤单,实则各生欢喜。这与时代的发展有关,从前人们生活单一