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

JavaLambda表达式详解(非常全面)

  Java Lambda表达式是JDK8引入的,是一个比较重要的特性。@mikechenLambda表达式简介
  Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数作为一个方法的参数,即行为参数化,函数作为参数传递进方法中。
  Lambda表达式可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。Lambda表达式的作用
  Java 8 引入的 Lambda表达式的主要作用就是简化代码,写出更优雅的代码。
  怎么一个简化优雅呢,举一Lambda语法创建线程和匿名内部类创建线程的例子,就非常清楚了。1.匿名类创建线程// JDK7匿名内部类写法 new Thread(new Runnable() {//接口名         @Override         public void run() {//方法名             System.out.println("mikechen");         }     });2.Lambda表达式创建线程// JDK8 Lambda来创建线程  new Thread(() -> System.out.println("mikechen"));
  上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步,这里连接口名和函数名都一同省掉了,Lambda表达式可以取代匿名内部类,写出更优雅的代码。Lambda表达式的语法
  lambda 表达式的语法格式如下:
  ():左侧部分指定了Lambda表达式需要的所有参数。->:Lambda表达式的操作符或者箭头操作符。{}:右侧部分指定了Lambda体,即方法需要实现的内容。
  示例:
  Lambda体只有一条语句:
  示例:() -> System.out.println("mikechen");
  请注意,括号中没有内容。那就是表示lambda不带任何参数。2.一个参数
  示例:Consumer con = (x) -> System.out.println(x);
  当lambda表达式是单个参数时,也可以省略括号,如下所示:Consumer con = x -> System.out.println(x);3.多个参数
  如果Java lambda表达式匹配的方法有多个参数,则需要在括号内列出这些参数,代码如下:BinaryOperator bo = (a, b) -> { System.out.println("函数式接口"); return a + b; };
  注意:仅当方法是单个参数时,才可以省略括号。4.指定参数类型
  如果编译器无法从lambda匹配的函数式接口抽象方法推断参数类型,则有时可能需要为lambda表达式指定参数类型。(Car car) -> System.out.println("The car is: " + car.getName());
  如你所见,car参数的类型(Car)写在参数名称的前面,就像在其他方法中声明参数或对接口进行匿名实现时一样。5.只有一条语句时
  当Lambda体只有一条语句时,return和大括号可以省略,示例:BinaryOperator bo = (a, b) -> a + b;6.参数类型不写
  Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能够通过上下文推断出数据类型,这就是"类型推断",示例:BinaryOperator bo = (Integer a, Integer b) -> { return a + b; };
  等同于BinaryOperator bo = (a, b) -> { return a + b; };
  上述 Lambda 表达式中的参数类型都是由编译器推断得出,Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。
  Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的,这就是所谓的"类型推断"。7.Lambda表达式返回值
  你可以从Java lambda表达式返回值,就像从方法中返回值一样。你只需向lambda表达式主体添加一个return,如下所示:(param) -> {     System.out.println("param: " + param);     return "return value";   }函数式接口
  Lambda表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface {}
  一种用于表示一个接口是Java语言规范定义的函数式接口的注解类型。
  对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方。public interface MyFunctionInterface { public T getValue(T t); }
  为了确保函数式接口的正确性,我们可以给这个接口添加@FunctionalInterface注解,这样当其中有超过一个抽象方法时就会报错。Unexpected @FunctionalInterface annotation  @FunctionalInterface ^ WorkerInterface is not a functional interface multiple   non-overriding abstract methods found in interface WorkerInterface 1 error
  Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。Lambda表达式的举例
  学习 Lambda 表达式的最好方式是学习例子,下面我们看几个比较常用的例子。1.lambda创建线程
  使用() -> {} 替代匿名类://JDK 8之前 new Thread(new Runnable() { @Override public void run() { System.out.println("使用匿名内部类,开线程"); } }).start();  //JDK 8 使用lambda表达式 new Thread(() -> System.out.println("使用lambda表达式,开线程")).start();2.lambda事件处理
  使用lambda表达式如下所示写出更好的事件侦听器的代码:// Java 8之前: button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button被点击了使用老的方式!"); } });  // Java 8方式: button.addActionListener( (e) -> { System.out.println("Button被点击了使用Lambda表达式!"); });3.lambda遍历List集合
  集合的遍历,采用lambda表达式会更简洁:// Java 8之前: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); for (String feature : features) { System.out.println(feature); }  // Java 8之后: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); features.forEach(n -> System.out.println(n));  // 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示, features.forEach(System.out::println);
  方法引用是使用两个冒号::这个操作符号。4.元素排序
  之前我们若要为集合内的元素排序,就必须调用 sort 方法,传入比较器重写 compare。
  方法的比较器对象,现在我们还可以使用 lambda 表达式来简化代码。public static void main(String[] args) {     List list = new ArrayList<>();     list.add("a");     list.add("d");     list.add("b");     list.add("c");     list.sort((o1,o2)->o1.compareTo(o2));     list.forEach(System.out::println); }5.lambda Map// 不使用lambda表达式为每个订单加上12%的税 List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); for (Integer cost : costBeforeTax) { double price = cost + .12*cost; System.out.println(price); } // 使用lambda表达式 List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);6.lambda过滤String// 创建一个字符串列表,每个字符串长度大于2 List filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList()); System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);7.lambda对集合应用函数// 将字符串换成大写并用逗号链接起来 List G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); System.out.println(G7Countries);8.lambda计算最大值、最小值、平均值//获取数字的个数、最小值、最大值、总和以及平均值 List primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29); IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("Highest prime number in List : " + stats.getMax()); System.out.println("Lowest prime number in List : " + stats.getMin()); System.out.println("Sum of all prime numbers : " + stats.getSum()); System.out.println("Average of all prime numbers : " + stats.getAverage());
  以上就是Java 8的lambda表达式的详解,希望对你有所用!
  更多架构技术干货,私信【架构】即可查看我原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集。

国产全画幅摄影机崛起旗舰标杆专业拍摄必备KINEFINITYMAVOEdge6K摄影机国产之光卓曜科技,3月30日正式推出了KINEFINITYMAVOEdge6K摄影机。配备了全画幅规格的32CMOS传感器,有效像素为iGameGeForceRTX3090Ti水神显卡首发体验暴打TITANRTX七彩虹iGameNeptune水神系列显卡,一直以来是仅次于九段的王牌产品。全新的GeForceRTX3090Ti显卡作为英伟达RTX30系列显卡的巅峰之作,与七彩虹iGame水神蓝厂7英寸大屏新机曝光素皮后盖滑动静音按键,定位商务旗舰?目前国内几家头部手机厂商的迭代新品都发布得差不多了,蓝厂虽说来得慢,但是一下子会推出几款重磅新品。vivo新品发布会已经定档4月11日,除了X80系列,XNoteXFold以及平板市值蒸发超96,裁员千人,微信电商第一股怎么了?微信自己做了,有赞只能死只要腾讯还在一天,那么国内的所有互联网公司结局只有倒闭!2010年7月,著名互联网行业期刊计算机世界发布了一篇名为的腾讯的文章,文章犀利的指出腾讯靠抄袭发家搬进新宿舍没有网咋办?蒲公英X4C无线4G路由器居然可以这样救急前言当你住在员工宿舍,没有网络接口,别家的WiFi信号又不好应该咋办?这次我就遇到了类似的问题一个读完研的发小被安排在医院的员工宿舍。作为初来乍到的实习生,配搭的房间自然也不是太好运动时佩戴什么耳机比较合适骨传导运动耳机推荐运动和音乐都是现代生活中必不可少的生活元素,每天进行适当的运动,听一些音乐都可以缓解生活上的劳累。运动时佩戴有线耳机不仅不方便,还会对耳朵造成伤害,无线蓝牙耳机已经成为了运动耳机的刚聊什么,手机就会给推什么,真的吗?01调用手机麦克风权限如今,我们在下载使用手机APP时,经常会按照要求习惯性授予其手机权限,有时就包括手机麦克风。这就让一些APP有机可乘,当我们使用这些APP时,就有被通过麦克风投影仪伤不伤眼?了解一下伤眼的判断标准是什么?大家下班后,主要的放松是什么?想必,除了刷手机打游戏,绝大多数的人就是看电视吧!可对于租房党和学生族而言,如今动辄六七十寸的大电视放在所处的空间里,真的是个大累赘,手机或是电脑又没一探究竟手机充电器能不能混用?现在小伙伴们经常会遇到这么一种情况在手机快没电时,经常随便拿起一部充电器来充电。对此,有的小伙伴认为这样会很危险,有的认为只要能充电则万事大吉,那究竟这样做合不合理,安不安全?带着坚持两个聚焦战略普联软件上市首年净利同比增长66。18中证网讯(王珞)普联软件3月30日晚间发布上市后的首份年度报告,2021年公司坚持聚焦大型集团客户聚焦优势业务领域的发展战略,持续扩大战略客户服务领域,不断拓展细分领域的客户市场,新能源你想知道的事光伏基本面硅料价格走势,能否抄底以下内容来自泰达宏利基金直播间,嘉宾泰达宏利基金经理孙硕,在管产品泰达宏利绩优混合。更多精彩内容,请订阅泰达宏利头条号。Q1近期新能源的四个主要行业基本面如何?首先来看光伏,光伏的
地图类APP的盈利模式是怎样的?在2014年的时候,QQ免费推出,如今它的盈利能力无人质疑,就像今天的百度高德地图一样,并不是要收使用费,而是获取增值服务价值。更值得关注的是,大家认为的免费地图高德,在去年2月份数字货币为什么重要?数字经济这幅画上点睛之笔是什么?请大家多多转发关注,如果有错误请各位指出,一些自以为的想法。首先我们来理解,由原文上的话语。数字经济是全球经济增长日益重要的驱动力。第一个问题驱动力在哪??根据央行行长易纲观点,法1万多元的低速车和2万多的低速车区别有多大?两组测评数据告诉你请您在阅读前,先点击上面的关注。感谢您的支持,我们将为您带来更多有价值的内容。近日,据相关人士透露低速车国标将于今年11月份左右公开,这意味着低速车将以合法标准进入低速车消费者市场vivoS12与华为P50E手机全面对比区别一目了然继华为P50之后,华为又推出了一款新机华为P50E,这款新机目前已经在各大电商平台开启了预定,其价格要比华为P50便宜300元。我们的上一篇文章已经对华为P50E和华为P50进行了1分钟了解RedmiK50系列发布会,普及2K屏与OIS防抖,高性价比典范热门手机数码资讯早知道,记得关注作者。编辑孙凤新审核文峥RedmiK50系列正式发布,依然秉承高性价比路线,将颜值与性能拉满。K50系列机身圆润,握持手感极佳,聚齐双旗舰天玑处理器微信刚刚重磅升级,新增8大新功能!期待已久的功能,终于来了嗨,大家好呀,这里是科技小栈!微信PC版的新版本发布节奏相较于手机端还是比较慢的,我们知道在上周,微信发布了最新的Windows3。6。0内测版本,如今,正式版终于上线了!我们都知红米k50天玑810067万快充5500毫安电池,小米才是性价比之王这次将在3月22号发布红米k50,随之红米k50Pro也要发布。这两部的手机堆料是真足,价格方面也非常低,非常值得购买。现在我为大家分析一下这两部手机。红米k50这款手机的堆料可以长安奔奔EV提车等3个月!比奇瑞小蚂蚁还要火,起售仅需2。98万长安新能源2月销量11,121辆,环比下滑18,12月累计销量24,721辆,完成了21万辆目标的11。8。乘联会数据显示,奔奔EV12月累计销量15,412辆,同比暴涨137,领凯芙拉材质后盖全景舷窗!iQOO9Pro新配色质感出众大家是否有所感觉,今年手机市场的竞争远没有去年激烈,不少厂商的产品相比于去年同级定位的产品有着一定幅度的缩水,但也有一些厂商依旧能够带来更好的新旗舰产品,比如我们所熟知的iQOO。假货泛滥怎么治?工业区块链技术码上辨真假假货泛滥怎么治?区块链技术派上用场,码上扫一扫即可辨真假。在四川省南充市嘉陵区,蒲马院村形成了初具产业规模的以柠檬柑橘肉牛养殖为主导的农业体系,但生产管理方式粗放,经济效益不高。作Nature便携式诊断技术,出现新王者?芯片实验室(Labonachip)系统旨在将实验室的功能封装在一个微型设备中,用于医疗诊断生物医学组织工程和环境采样。但这类系统通常需要笨重的辅助设备,例如流体泵显微镜和高压电源,