保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

为什么要使用lambda表达式?原来如此,涨知识了

  为什么要使用Lambda表达式
  先看几段Java8以前经常会遇到的代码:
  创建线程并启动创建线程publicclassWorkerimplementsRunnable{Overridepublicvoidrun(){for(inti0;i100;i){doWork();}}}启动线程WorkerwnewWorker();newThread(w)。start();
  比较数组定义一个比较器publicclassLengthComparatorimplementsComparatorString{Overridepublicintcompare(Stringfirst,Stringsecond){returnInteger。compare(first。length(),second。length());}}对字符数组进行比较Arrays。sort(words,newLengthComparator());
  给按钮添加单击事件publicvoidonClick(Buttonbutton){button。addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System。out。println(buttonclicked。);}});}
  对于这三段代码,我们已经司空见惯了。
  但他们的问题也很突出:就是噪声太多!想实现一个数组的比较功能,至少要写5行代码,但其中只有一行代码才是我们真正关注的!
  Java复杂冗余的代码实现一直被程序员所诟病,好在随着JVM平台语言Scala的兴起以及函数式编程风格的风靡,让Oracle在Java的第8个系列版本中进行了革命性的变化,推出了一系列函数式编程风格的语法特性,比如Lambda表达式以及Stream。
  如果采用Lambda表达式,上面三段代码的实现将会变得极为简洁。
  创建线程并启动(采用Lambda版本)newThread((){for(inti0;i100;i){doWork();}})。start();
  比较数组(采用Lambda版本)Arrays。sort(words,(first,second)Integer。compare(first。length(),second。length())
  给按钮添加单击事件(采用Lambda版本)button。addActionListener((event)System。out。println(buttonclicked。));
  怎么样?通过Lambda表达式,代码已经变得足够简洁,让你把关注点全部都放在业务代码上。Lambda表达式的语法
  格式:(参数)表达式
  其中:参数可以为0n个。如果有多个参数,以逗号(,)分割。如果有一个参数,括号()可以省去;如果没有参数,括号()也不能省去。〔这就有点不够纯粹了,比scala还是差了点!〕,参数前可以加类型名,但由于自动类型推导功能,可以省去。表达式可以是一行表达式,也可以是多条语句。如果是多条语句,需要包裹在大括号{}中。表达式不需要显示执行返回结果,它会从上下文中自动推导。以下是一些例子:
  一个参数eventSystem。out。println(buttonclicked。)
  多个参数(first,second)Integer。compare(first。length(),second。length()复制代码
  0个参数()System。out。println(whatareyounongshalei?)
  表达式块(){for(inti0;i100;i){doWork();}}函数式接口
  在Java8中新增加了一个注解:〔FunctionalInterface〕,函数式接口。
  什么是函数式接口呢?它包含了以下特征:接口中仅有一个抽象方法,但允许存在默认方法和静态方法。〔FunctionalInterface〕注解不是必须的,但建议最好加上,这样可以通过编译器来检查接口中是否仅存在一个抽象方法。
  Lambda表达式的本质就是函数式接口的匿名实现。只是把原有的接口实现方式用一种更像函数式编程的语法表示出来。
  Java8的java。util。function包已经内置了大量的函数式接口,如下所示:
  函数式接口
  参数类型
  返回类型
  方法名
  描述
  Supplier
  无
  T
  get
  产生一个类型为T的数据
  Consumer
  T
  void
  accept
  消费一个类型为T的数据
  BiConsumerT,U
  T,U
  void
  accept
  消费类型为T和类型为U的数据
  FunctionT,R
  T
  R
  apply
  把参数类型为T的数据经过函数处理转换成类型为R的数据
  BiFunctionT,U,R
  T,U
  R
  apply
  把参数类型为T和U的数据经过函数处理转换成类型为R的数据
  UnaryOperator
  T
  T
  apply
  对类型T进行了一元操作,仍返回类型T
  BinaryOperator
  T,T
  T
  apply
  对类型T进行了二元操作,仍返回类型T
  Predicate
  T
  void
  test
  对类型T进行函数处理,返回布尔值
  BiPredicateT,U
  T,U
  void
  test
  对类型T和U进行函数处理,返回布尔值
  从中可以看出:内置的函数式接口主要分四类:Supplier,Consumer,Function,Predicate。Operator是Function的一种特例。除了Supplier没有提供二元参数以外(这和java不支持多个返回值有关),其他三类都提供了二元入参。
  以下是一个综合的例子:publicclassFunctionalCase{publicstaticvoidmain(String〔〕args){StringwordsHello,World;StringlowerWordschangeWords(words,String::toLowerCase);System。out。println(lowerWords);StringupperWordschangeWords(words,String::toUpperCase);System。out。println(upperWords);intcountwordsToInt(words,String::length);System。out。println(count);isSatisfy(words,ww。contains(hello));StringotherWordsappendWords(words,(){ListStringallWordsArrays。asList(abc,efg);returnallWords。get(newRandom()。nextInt(2));});System。out。println(otherWords);consumeWords(words,wSystem。out。println(w。split(,)〔0〕));}publicstaticStringchangeWords(Stringwords,UnaryOperatorStringfunc){returnfunc。apply(words);}publicstaticintwordsToInt(Stringwords,FunctionString,Integerfunc){returnfunc。apply(words);}publicstaticvoidisSatisfy(Stringwords,PredicateStringfunc){if(func。test(words)){System。out。println(testpass);}else{System。out。println(testfailed。);}}publicstaticStringappendWords(Stringwords,SupplierStringfunc){returnwordsfunc。get();}publicstaticvoidconsumeWords(Stringwords,ConsumerStringfunc){func。accept(words);}}
  如果觉得这些内置函数式接口还不够用的话,还可以自定义自己的函数式接口,以满足更多的需求。方法引用
  如果Lambda表达式已经有实现的方法了,则可以用方法引用进行简化。方法引用的语法如下:对象::实例方法类::静态方法类::实例方法
  这样前面提到的Lambda表达式:eventSystem。out。println(event)
  则可以替换为:System。out::println
  另一个例子:(x,y)x。compareToIgnoreCase(y)
  可以替换为:String::compareToIgnoreCase
  注意:方法名后面是不能带参数的!可以写成System。out::println,但不能写成System。out::println(hello)
  如果能获取到本实例的this参数,则可以直接用this::实例方法进行访问,对于父类指定方法,用super::实例方法进行访问。
  下面是一个例子:publicclassGreeter{publicvoidgreet(){StringlowcaseStrchangeWords(Hello,World,this::lowercase);System。out。println(lowcaseStr);}publicStringlowercase(Stringword){returnword。toLowerCase();}publicStringchangeWords(Stringwords,UnaryOperatorStringfunc){returnfunc。apply(words);}}classConcurrentGreeterextendsGreeter{publicvoidgreet(){ThreadthreadnewThread(super::greet);thread。start();}publicstaticvoidmain(String〔〕args){newConcurrentGreeter()。greet();}}构造器引用
  构造器引用和方法引用类似,只不过函数接口返回实例对象或者数组。构造器引用的语法如下:类::new数组::new
  举个例子:ListStringlabelsArrays。asList(button1,button2);StreamButtonstreamlabels。stream()。map(Button::new);ListButtonbuttonsstream。collect(Collectors。toList());
  其中的labels。stream()。map(Button::new)相当于labels。stream()。map(labelnewButton(label))
  再看个数组类型的构造器引用的例子:Button〔〕buttonsstream。toArray(Button〔〕::new);
  把Stream直接转成了数组类型,这里用Button〔〕::new来标示数组类型。变量作用域
  先看一段代码:publicvoidrepeatMsg(Stringtext,intcount){Runnabler(){for(inti0;icount;i){System。out。println(text);Thread。yield();}};}
  一个lambda表达式一般由以下三部分组成:参数表达式自由变量
  参数和表达式好理解。那自由变量是什么呢?它就是在lambda表达式中引用的外部变量,比如上例中的text和count变量。
  如果熟悉函数式编程的同学会发现,Lambda表达式其实就是闭包(closure)。只是Java8并未叫这个名字。对于自由变量,如果Lambda表达式需要引用,是不允许发生修改的。
  其实在Java的匿名内部类中,如果要引用外部变量,变量是需要声明为final的,虽然Lambda表达式的自由变量不用强制声明成final,但同样也是不允许修改的。
  比如下面的代码:publicvoidrepeatMsg(Stringtext,intcount){Runnabler(){while(count0){count;错误,不能修改外部变量的值System。out。println(text);}};}
  另外,Lambda表达式中不允许声明一个和局部变量同名的参数或者局部变量。比如下面的代码:PathfirstPaths。get(usrbin);ComparatorStringcomp(first,second)Integer。compare(first。length(),second。length());错误,变量first已经被定义接口中的默认方法
  先说说为什么要在Java8接口中新增默认方法吧。
  比如Collection接口的设计人员针对集合的遍历新增加了一个forEach()方法,用它可以更简洁的遍历集合。比如:list。forEach(System。out::println());
  但如果在接口中新增方法,按照传统的方法,Collection接口的自定义实现类都要实现forEach()方法,这对广大已有实现来说是无法接受的。
  于是Java8的设计人员就想出了这个办法:在接口中新增加一个方法类型,叫默认方法,可以提供默认的方法实现,这样实现类如果不实现方法的话,可以默认使用默认方法中的实现。
  一个使用例子:publicinterfacePerson{longgetId();defaultStringgetName(){returnjack;}}
  默认方法的加入,可以替代之前经典的接口和抽象类的设计方式,统一把抽象方法和默认实现都放在一个接口中定义。这估计也是从Scala的Trait偷师来的技能吧。接口中的静态方法
  除了默认方法,Java8还支持在接口中定义静态方法以及实现。
  比如Java8之前,对于Path接口,一般都会定义一个Paths的工具类,通过静态方法实现接口的辅助方法。
  接口中有了静态方法就好办了,统一在一个接口中搞定!虽然这看上去破坏了接口原有的设计思想。publicinterfacePath{publicstaticPathget(Stringfirst,String。。。more){returnFileSystem。getDefault()。getPath(first,more);}}
  这样Paths类就没什么意义了小结
  使用Lambda表达式后可以大幅减少冗余的模板式代码,使把更多注意力放在业务逻辑上,而不是复制一堆重复代码,除非你在一个用代码行数来衡量工作量的公司,你觉得呢?

人工智能能否改变生活?在创维深圳工厂电视生产线上,高精度视觉模组贴合设备正在有序工作。该设备在8K视觉、人工智能、5G云边协同等技术的支持下,采用全自动高精度机械手臂,与车间眼机器视觉完成模组玻璃撕……无缘华为麒麟芯片!荣耀全球首发新ampampquot自研am【8月12日讯】相信大家都知道,在全球平板电脑市场上,一直都被苹果iPad所霸占据,而Android平板电脑一直都因为软件生态问题,无法赢得消费者青睐,毕竟很多Android平……春卷又开车小鹏P7最新2。6。1升级体验(新AI声音NGP优这两天,我又问小鹏汽车的小伙伴借了辆P7回来。其实早在去年7月,我就已经试驾过P7并写过文章(详情请见4。3秒破百!借了一辆四驱高性能版的小鹏P7回家。。。)。而这次又把它抓回……感恩的作文700字集合七篇在学习、工作、生活中,说到作文,大家肯定都不陌生吧,作文是一种言语活动,具有高度的综合性和创造性。为了让您在写作文时更加简单方便,以下是小编为大家整理的感恩的作文700字7篇,……那一年冬天作文那是在20xx年的冬天,大雪纷纷扬扬地下着,冷风使人凉透心脾。可在我家,亲人们却在着急把姥姥送入医院。姥姥已到70岁高龄,岁月的逝去,生活的艰辛在她原本乌黑的头发上留下了……联想YOGA14s2021锐龙独显版全渠道开售首发6499元【CNMO新闻】在疫情依旧肆虐全球的当下,居家办公、学习基本已经成为了很多地方的常态。因此,拥有一台非常棒的移动设备进行工作、学习还是很有必要的。今天,联想YOGA14s202……她是妖,他是人。五百年前她为他所救,这便是一段孽缘的开始。她与他约定,每月十五相见。她为他舞,他为她琴。冰华芙蓉玉剔透,霓裳羽衣舞曼柔。却道不尽她的风华绝代的缥缈舞……数据库怎么选?中国信通院为您导航当前,新一轮科技革命迅猛发展,数据规模增长迅速、数据类型愈发丰富、数据应用快速深化,数据库作为信息系统的重要底座,其性能和稳定性面临不断挑战。数据库产品经过六十余年发展,如今呈……特斯拉的目光盯上未来的超级电源特斯拉最近收购超级电容制造商Maxwell,超级电容器确实比同样大小的电池存储的能量要少。但是,他们能够更快地释放电量,因为放电不依赖于发生的化学反应。有超过100万次的充放电……三星折叠苹果视频人像下半年智能手机大战已开打每年8、9月份,三星和苹果公司都会推出下一代的智能手机。8月11日,三星率先发布两款新型折叠屏智能手机,其中一款价格首次低于1000美元。苹果公司传言中的iPhone13……亚朵发布反转声明和阿里巴巴的关系,是撇清还是合谋?网友不买账亚朵在昨天发表关于阿里女员工授权办房卡的声明,为了维护酒店形象和名义,如果经调查属实,还能捎带脚的反转阿里女员工性侵案。对于亚朵的声明,网友纷纷表示:不买账。网友:……11岁天才少女踢馆支付宝,成为里巴巴最小程序员,网友太厉害她10岁对代码产生兴趣,便开始深入研究,11岁就已经纵横编程界,向支付宝宣战。在蚂蚁金服挑战赛中,她是全场年龄最小的选手,却差一秒打败无数人,赛后获得蚂蚁金服CEO发出的……
古代作文万能素材人物总的来说,一是源于所见所闻,二是源于思想感悟。那么有哪些关于古代人物的作文素材呢?下面是品学网小编为您整理的关于古代人物的万能作文素材,希望对您有所帮助!古代作文万能素材人物一……有关我的爸爸作文600字人们都说:世界上最伟大的爱是母爱!其实,父爱同母爱一样伟大,父爱是一种默默无闻,寓于无形之中的爱,只有用心看才能体会。恐惧时,父爱是一块脚踏石;黑暗时,父爱是一盏照明灯;枯褐时……父爱如山学生作文六篇父爱如山有人说母爱似水,哥哥的爱似画,姐姐的爱像云一样绵延,可我却觉得父爱如山!父爱的含义,是我的爸爸像一座大山,给了我依靠。我的爸爸,虽然他言语不多,可是他总是默默的为……心系祖国作文500字中国,一个伟大而以历史悠久的国家,作为中国人,我十分自豪。小编收集了心系祖国作文,欢迎阅读。第一篇:心系祖国祖国是哺育我们的母亲,是生命的摇篮。从我懂事起,我就知道……教师节献给老师的礼物作文(精选3篇)在平时的学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌生吧,借助作文可以提高我们的语言组织能力。你知道作文怎样写才规范吗?下面是小编整理的教师节献给老师的礼物作文(……成长多烦恼作文当你处于成长的青春期时,你的烦恼会多如牛毛!今天小编就来分享作文:成长多烦恼,请各位读者好好欣赏和借鉴。第一篇成长多烦恼成长,就好比我人生中的一艘小船,行驶在波面上……开学典礼高中作文开学典礼是新学期开始隆重地举行的仪式。为学生搭起展现自我的舞台,每学期的开学典礼是总结上学期成绩,回顾上学期,对本学期的工作进行展开,新的学期新的开始。小编精心为你整理了开学典……荷花作文三篇荷花篇一清晨,我到荷塘边看荷花。从远处看,荷塘迷迷蒙蒙只能看清荷花的颜色。啊!那是一片红的海洋。走近一看,荷塘里到处栽满盛开的荷花,这些荷花个个都亭亭玉立,粉的艳如桃李,……桔子香水的味道桔子香水的味道绚烂而缤纷的花季,阴晦而缠绵的雨季;青翠嫩绿融融的春;灿漫而炽热的夏;欢笑时的泪水,流泪时的微笑;轻松的抑压,沉重的放纵;一坛醇香的酒,一束鲜艳的花这……环境与我们的地球在银河系医院中,来了这样一位患者:他穿了一层大气的保暖内衣。他身上有湖泊,有海洋,有陆地,据说也是已知的唯一一个带生命的星球。它很美mdash;mdash;虽然这只是曾经。服务……关于我的对手四年级作文400字导语:竞争能激发人的潜力,而对手则是竞争的根源,那么您跟对手之间存在什么不一样的感情呢?下面是小编整理的一些关于描写对手的作文,供欣赏,希望您能喜欢。我的对手作文400字……字符串的常用操作方法查找与修改字符串的常用操作方法有查找,修改和判断三大类查找所谓字符串查找方法就是查找子串在字符串中的位置或出现的次数。find():检测某个子串是否包含在这个字符串中,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网