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

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

  为什么要使用Lambda表达式
  先看几段Java8以前经常会遇到的代码:
  创建线程并启动// 创建线程 public class Worker implements Runnable {     @Override     public void run() {         for (int i = 0; i < 100; i++) {             doWork();         }     } } // 启动线程 Worker w = new Worker(); new Thread(w).start();
  比较数组// 定义一个比较器 public class LengthComparator implements Comparator {  @Override  public int compare(String first, String second) {      return Integer.compare(first.length(), second.length());  } } //对字符数组进行比较 Arrays.sort(words, new LengthComparator());
  给按钮添加单击事件public void onClick(Button button) {   button.addActionListener(new ActionListener() {       @Override       public void actionPerformed(ActionEvent e) {           System.out.println("button clicked.");       }   }); }
  对于这三段代码,我们已经司空见惯了。
  但他们的问题也很突出:就是噪声太多!想实现一个数组的比较功能,至少要写5行代码,但其中只有一行代码才是我们真正关注的!
  Java复杂冗余的代码实现一直被程序员所诟病,好在随着JVM平台语言Scala的兴起以及函数式编程风格的风靡,让Oracle在Java的第8个系列版本中进行了革命性的变化,推出了一系列函数式编程风格的语法特性,比如Lambda表达式以及Stream。
  如果采用Lambda表达式,上面三段代码的实现将会变得极为简洁。
  创建线程并启动(采用Lambda版本)new Thread(() -> { for (int i = 0; i < 100; i++) {     doWork(); } }).start();
  比较数组(采用Lambda版本)Arrays.sort(words, (first, second) -> Integer.compare(first.length(), second.length())
  给按钮添加单击事件(采用Lambda版本)button.addActionListener((event) -> System.out.println("button clicked."));
  怎么样?通过Lambda表达式,代码已经变得足够简洁,让你把关注点全部都放在业务代码上。Lambda表达式的语法
  格式:(参数) -> 表达式
  其中:参数可以为0-n个。如果有多个参数,以逗号(,)分割。如果有一个参数,括号()可以省去;如果没有参数,括号()也不能省去。[这就有点不够纯粹了,比scala还是差了点!],参数前可以加类型名,但由于自动类型推导功能,可以省去。表达式可以是一行表达式,也可以是多条语句。如果是多条语句,需要包裹在大括号{}中。表达式不需要显示执行返回结果,它会从上下文中自动推导。 以下是一些例子:
  一个参数event -> System.out.println("button clicked.")
  多个参数(first, second) -> Integer.compare(first.length(), second.length() 复制代码
  0个参数() -> System.out.println("what are you nongshalei?")
  表达式块() -> {for (int i = 0; i < 100; i++) {    doWork();}} 函数式接口
  在Java8中新增加了一个注解: [@FunctionalInterface],函数式接口。
  什么是函数式接口呢?它包含了以下特征:接口中仅有一个抽象方法,但允许存在默认方法和静态方法。[@FunctionalInterface]注解不是必须的,但建议最好加上,这样可以通过编译器来检查接口中是否仅存在一个抽象方法。
  Lambda表达式的本质就是函数式接口的匿名实现。只是把原有的接口实现方式用一种更像函数式编程的语法表示出来。
  Java8的java.util.function包已经内置了大量的函数式接口,如下所示:
  函数式接口
  参数类型
  返回类型
  方法名
  描述
  Supplier
  无
  T
  get
  产生一个类型为T的数据
  Consumer
  T
  void
  accept
  消费一个类型为T的数据
  BiConsumer
  T,U
  void
  accept
  消费类型为T和类型为U的数据
  Function
  T
  R
  apply
  把参数类型为T的数据经过函数处理转换成类型为R的数据
  BiFunction
  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进行函数处理,返回布尔值
  BiPredicate
  T,U
  void
  test
  对类型T和U进行函数处理,返回布尔值
  从中可以看出:内置的函数式接口主要分四类:Supplier, Consumer, Function,Predicate。Operator是Function的一种特例。除了Supplier没有提供二元参数以外(这和java不支持多个返回值有关),其他三类都提供了二元入参。
  以下是一个综合的例子:public class FunctionalCase {     public static void main(String[] args) {         String words = "Hello, World";         String lowerWords = changeWords(words, String::toLowerCase);         System.out.println(lowerWords);          String upperWords = changeWords(words, String::toUpperCase);         System.out.println(upperWords);          int count = wordsToInt(words, String::length);         System.out.println(count);          isSatisfy(words, w -> w.contains("hello"));         String otherWords = appendWords(words, ()->{             List allWords = Arrays.asList("+abc", "->efg");             return allWords.get(new Random().nextInt(2));         });         System.out.println(otherWords);         consumeWords(words, w -> System.out.println(w.split(",")[0]));     }     public static String changeWords(String words, UnaryOperator func) {         return func.apply(words);     }     public static int wordsToInt(String words, Function func) {         return func.apply(words);     }     public static void isSatisfy(String words, Predicate func) {         if (func.test(words)) {             System.out.println("test pass");         } else {             System.out.println("test failed.");         }     }     public static String appendWords(String words, Supplier func) {         return words + func.get();     }     public static void consumeWords(String words, Consumer func) {         func.accept(words);     } }
  如果觉得这些内置函数式接口还不够用的话,还可以自定义自己的函数式接口,以满足更多的需求。方法引用
  如果Lambda表达式已经有实现的方法了,则可以用方法引用进行简化。 方法引用的语法如下:对象::实例方法类::静态方法类::实例方法
  这样前面提到的Lambda表达式:event -> System.out.println(event)
  则可以替换为:System.out::println
  另一个例子:(x,y)->x.compareToIgnoreCase(y)
  可以替换为:String::compareToIgnoreCase
  注意:方法名后面是不能带参数的! 可以写成System.out::println,但不能写成System.out::println("hello")
  如果能获取到本实例的this参数,则可以直接用this::实例方法进行访问,对于父类指定方法,用super::实例方法进行访问。
  下面是一个例子:public class Greeter {     public void greet() {         String lowcaseStr = changeWords("Hello,World", this::lowercase);         System.out.println(lowcaseStr);     }     public String lowercase(String word) {         return word.toLowerCase();     }     public String changeWords(String words, UnaryOperator func) {         return func.apply(words);     } } class ConcurrentGreeter extends Greeter {     public void greet() {         Thread thread = new Thread(super::greet);         thread.start();     }     public static void main(String[] args) {         new ConcurrentGreeter().greet();     } } 构造器引用
  构造器引用和方法引用类似,只不过函数接口返回实例对象或者数组。 构造器引用的语法如下:类::new数组::new
  举个例子:List labels = Arrays.asList("button1", "button2"); Stream

阿里巴巴进货可靠吗?阿里巴巴作为全球领先的电商企业,旗下的进货网1688也是全球顶尖产品的交易市场。但是,每年的3。15打假阿里巴巴都被点名。对此很多人就开始担忧阿里巴巴进货可靠吗?在阿里巴巴进货有没巴黎欧莱雅就面膜事件致歉将提出能针对所有相关消费者的妥善解决方案11月18日凌晨,巴黎欧莱雅就面膜事件发布致歉声明称,经初步调查,此次出现部分消费者在预售后以较低价格拍下商品,是因为叠加使用了多种平台及店铺的优惠。对于此次因过于繁琐复杂的销售机非典型理工男深耕行业13年陈博让救援英雄成为游戏主角非典型理工男深耕行业13年陈博让救援英雄成为游戏主角华西都市报封面新闻记者朱珠热爱冒险,喜欢独处,遇事沉着冷静,这个非典型理工男陈博是一家游戏公司的创始人,而他做的游戏都和救援英雄天玑9000芯片到底是不是华为的麒麟芯片改名的?我看有些人是魔怔了,居然会有天玑9000是华为麒麟芯片改名的想法,当然有些人估计是觉得天玑9000如果到时候表现好,那就是华为出手的缘故,然后又可以沸腾一番,可是这是不可能的,天玑光羿科技第三代电致变色技术,控光与控热的密钥近年来,全球工业科技领域出现了一种新型材料电致变色材料。业内人士指出,电致变色材料是目前有研究和应用前景的智能材料之一,其在学术界已活跃了近半个世纪,虽拥有巨大商业前景。而将电致变比特币白皮书的核心思想是什么,能否做些简洁的概括?比特币的定义,就是点对点的电子现金系统,所谓p2p也就是pointtopoint的技术,点对点不通过任何金融机构,从而实现交易。说到电子货币的交易,以往的交易模式的弊病,是不能防止在执行死刑前,若研制出芯片,可以免除死刑吗?科幻片看多了吧?你先明白什么是芯片,怎么制造出来的,然后你在牢房里带着重型犯人的脚链和手链,机器设备没有,怎么造出芯片???这操作在中国是完全可以的,不一定要芯片而且不一定要真自己如何做好网站建设?在大多情况下,我们在设计网站页面的时候,很多人都关注导航栏和内容的布局,而网站页面底部通常都是被忽略的。事实上,网站页面底部也是整个网站的重要组成部分,用户也可以从页面底部获取想要贾跃亭FF公司Q3巨亏近18亿!被指财务欺诈启动调查,公司称明年7月交付首批FF91中国经济周刊经济网讯据媒体报道,11月15日,FaradayFuture(法拉第未来)向美国证券交易委员会提交的报告显示,因为调查尚未完成,所以无法完整披露三季度财报。但分享了其第37岁把公司卖给马云,套现300亿全部用来造车,何小鹏究竟有多牛文鉴史人编辑鉴史人37岁将公司卖给马云,到手300亿,创造互联网史上金额最大并购案的壮举。而不甘舒适的他,选择砸出全部身价再次创业,赌上前半生赚的功与名,横着膀子开始造汽车。他的传特斯拉没有在中国内地使用星链服务的计划通信1特斯拉没有在中国内地使用星链服务的计划近日,记者从特斯拉中国获悉,目前特斯拉在中国内地没有使用星链服务的计划,所有中国内地的车辆及充电站,均使用中国通讯运营商提供的网络服务,
互联网定制险走俏背后创新基因与用户思维的胜利变革或许有些姗姗来迟,但终究已经在路上。一直以来被传统巨头主导的保险行业也迎来了互联网新势力的挑战,而其中,最具观察意义的就是近年来,互联网定制险正越来越受到市场的青睐。互联网定制10万台免费体验!智能健身第一品牌FITURE开启疯狂扩张模式2021年4月14日,中国智能健身企业FITURE(拟合未来)于北京诺金酒店召开了创世纪2021春季发布会。FITURE成立于2019年,作为智能健身第一品牌,围绕其首款智能健身产破而后立,广汽传祺欲造传奇在开始今天的正文之前,我们先来看几组数据1。2021年第一季度总销量74259辆,同比增幅36。3。2。3月全系销量26148辆,同比增幅48。2,并实现连续9个月同比正增长。3。办竞赛红色研学广州党史学习教育进校园活动启动3月27日,以传承红色基因培育时代新人为主题的广州市中小学党史学习教育进校园暨深化红色教育系列活动在广东广雅中学正式开启,活动由广州市教育局市关工委市文明办联合主办,由广东广雅中学饭冰冰广州卖潮搭月入千万,快手电商瞄准新赛道快速增长的GMV,印证着快手电商潮搭生态的先天优势,而与产业源头广州的强强互补,将为李洛洛们带来了更多的想象空间与发展可能。本文由无冕财经(wumiancaijing)原创首发作者探秘广汽传祺,自主品牌何以领跑高端MPV市场来源金融界网作者闫利金融界网4月9日消息近年来,自主品牌发力向上,智能化混动化等车圈新词已经逐步渗透向各大车企。资本的加码新势力的出圈消费者的追捧,无不让车企这个看似已有百年之久的浪奇危局存货跑路后的烂摊子,国资也救不了?浪奇实控人本就是广州国资,面对数十亿债务窟窿,换一家国企接盘的可能性较大,但这样无异于左手倒右手,国资债权无法得到真正清偿,还可能掉入更大的坑。本文由无冕财经(wumiancaij齐翔腾达新项目持续兑现业绩,首季盈利预增逾2倍得益于提前布局,齐翔腾达的产业链扩张正充分享受化工行业顺周期的红利,步入新一轮高速成长周期。本文由无冕财经(wumiancaijing)发布编辑陈涧设计布冬实习生郭曼怡4月6日,齐湾区样本,产品为王世茂海峡大湾区城市赋能的产品组合拳大湾区,是战场,也是考场。进湾赶考,最能验证一家地产公司的成色。疫情与调控叠加之下,去年的地产行业充满不确定性。世茂海峡2020年销售仍成功跨越1000亿大关,大湾区布局首年业绩也蒙牛在憋着一个大招乳业双寡头竞争,蒙牛的营收利润市值均被伊利甩开差距,难道真成了被抛弃的蒙牛?常温奶摸到了天花板,鲜奶消费急剧增长,上游奶源够用吗?现代牧业并购富源国际,意味着什么?本文由无冕财经(超级大脑震撼亮相,看恒大汽车如何车联万物?如果说电动化是汽车变革的上半场,下半场则是智能化。在新一轮的造车浪潮中,产业黑马恒大汽车凭借什么脱颖而出?本文由无冕财经(wumiancaijing)原创发布作者杨煜编辑雷缓之设计