为什么要了解和使用拉姆达

原因一:为了充分利用电脑多核的特性。由于一般的Java程序员接触大规模并发计算的经验比较少,甚至没有,所以在编写代码时也不会考虑性能问题。Lambda诞生后,你只需要简单地调用一些方法就可以解决性能问题。比如我们知道 int 的包装类是 Integer ,int基本类型占用4个字节的内存,Integer 对象要占用16个字节的内存,你可以写List<Integer>但是不能写List<int>,但是数组就可以是 [Integer] 也可以是 [int] 。如果你要执行这样的操作:把int 放入 Integer ,再把 Integer 按 int 计算,再把计算结果从 Integer 中取出来。如下

Integer  m = new Integer(5);
m = m*2;
System.out.print(m);

当然,这段代码看起来有点滑稽,我们可能经常在List<Integer>中循环处理这种滑稽的运算。这里有多滑稽呢,第一步,把 int 打包到 Integer ;第二步, Integer 解包成 int 进行计算;第三步,计算结果打包到 Integer;第四步,使用结算结果还得从包装类 Integer 解包得到 int 。我们发现,中间绝大部分操作占用了cup时间,而且涉及到一些连续性的操纵,只能在一个核里完成,这样是会影响我们程序性能的,若Integer是某个对象的一个值,那么这样的损耗更甚。使用Lambda你不在用考虑这种性能问题,就可以简单地提升性能。

原因二:代码跟简洁,方便维护。关于这一点,你需要学习一些Lambda语法后,才能了解。比如下面:有这样一个逻辑,需对List<Person> allPerson中的“男”性人数进行统计。

旧代码可能会这样写:

  List<Person> allPerson = getPerson();int count = 0;for(Person person:allPerson){if(person.getGen().equals("男")){count++;}}System.out.println("男性人数为"+count);
新方式可能会这样写:
    List<Person> allPerson = getPerson();System.out.println("男性人数为"+ allPerson.stream().filter(person -> person.getGen().equals("男")).count());

更多更强大的方式我们后续再说。

原因三:可以无“副作用”地修改方法。简单地讲就是,我定义一个方法,可以强行加给另外一个已经存在的类,因为我需要,然后可以用后即焚,不影响其他地方使用。

实际上Lambda就是让Java拥有了函数编程的的功能,什么是函数编程(搜),函数编程那就是千人前面。这里我们不需要定义它,只要能用就行了。这也是为什么我们可以对一个对象加入方法,因为方法就是函数。Lambda算得上是闭包(Closure)的一个翻版,那为啥不叫闭包呢,因为Java历史上已经用一个闭包了。如果你对Javascript有所了解,那么接下来的要讲的东西,或许会感觉似曾相识。比如Array.prototype里面的filter,map,some,reduce等方法。



为了各位调试测试,我先贴出后面例子中会用到的测试用例类

class PersonFactory {/*** 随机产生指定个 {@link #Person}对象,并赋初值* * @param personNum*            生成多少个 {@link #Person}对象* @return*/public List<Person> getPersons(int personNum) {List<Person> list = new ArrayList<Person>();String names[] = { "军", "荣", "莉", "轩", "兴", "馨", "云浩", "欣兰" };String firstNames[] = { "张", "陈", "王", "李", "蒲", "吴", "郝", "林" };for (int i = 0; i < personNum; i++) {int fn = (int) (Math.random() * firstNames.length);int n = (int) (Math.random() * names.length);int age = (fn + 1) * (n + 1);Person p = new Person();p.setAge(age);p.setFirstName(firstNames[fn]);p.setName(names[n]);p.setGen(age % 3 == 0 ? "女" : "男");list.add(p);}return list;}
}class Person {private int age;private String name;private String firstName;private String gen;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getGen() {return gen;}public void setGen(String gen) {this.gen = gen;}@Overridepublic String toString() {return firstName + name + " \tage:" + age + " \tgender:" + gen;}
}

为什么要了解和使用拉姆达——走进Java Lambda(〇)相关推荐

  1. C#拉姆达(=)表达式

    前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...

  2. SqlSugar常用查询实例-拉姆达表达式

    SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表SqlSugarClient db = SugarContext.GetInstance() ...

  3. java1.8 Lambda拉姆达表达式深入探究

    当我们遇到下面情况时: SingleObj.getInstance().setRunnable(new Runnable() {@Overridepublic void run() {} }); 编译 ...

  4. C# 匿名方法和拉姆达表达式

    "` "`代码如下: using System; using System.Collections.Generic; using System.Linq; using System ...

  5. 多线程 委托 匿名函数 拉姆达 事件

    多线程 using System; using System.Threading;//引用的命名空间 这个命名空间有C#对线程的各种操作namespace aaa//瞎起的名字哈哈 {class Pr ...

  6. 拉姆达999城市电话114 V3.3.1

    介绍 [拉姆达999城市电话114 V3.3.1]功能模块+ 单一开放版本+电话查询小程序前端+此更新需要小程序代码升级 源码大小:303KB 开发语言:PHP+Mysql 操作系统:Windows, ...

  7. Java8 拉姆达与集合中对象处理方式记录

    List<SkuDto> list = productPO.getList().stream().map(e -> new skuDto(e.getSkuId(), e.getPro ...

  8. 新冠全球确诊超2亿!德尔塔后,新「毒王」拉姆达已蔓延32国

    转自:新智元 [导读]刚刚,新冠全球确诊已超2亿.然而,德尔塔超强传播力的恐慌尚未平息,拉姆达(λ)变异毒株又引起了高度重视.它不仅具有高度传染性,而且或能逃避疫苗保护.全球警钟再次拉起! 2亿. 令 ...

  9. java8新特性(拉姆达表达式lambda)

    一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的java.lang.Runn ...

  10. lambda表达式 拉姆达

    lambda表达式 拉姆达 学习这个之前,需要明确 有一种接口叫做函数式接口,只允许接口里面只有一个函数 可以使用 @FunctionalInterface进行注解 如果这个接口里面定义了两个方法,就 ...

最新文章

  1. CodeForces - 960F[动态开点线段树优化dp]详解
  2. php的异常处理,PHP异常处理Exception类
  3. [转载] 中华典故故事(孙刚)——13 马虎
  4. 【HTTPS、HTTP】网易新闻首页https跨协议调用http的问题
  5. 关于java的集合类,以及HashMap中Set的用法!
  6. 60+ 安全厂商的选择,为何 TA 一直坚持做威胁情报供应商?
  7. ROS开发时的服务器启动命令
  8. 易语言php支付宝,支付宝填表登录易语言源码
  9. Appium运行时,error: Logcat capture failed: spawn ENOENT的解决办法
  10. maven打本地JAR包
  11. Android属性动画之ObjectAnimator控制
  12. MySQL数据库检查修复详解
  13. 【渝粤教育】国家开放大学2018年秋季 2312T旅行社经营管理 参考试题
  14. 机器学习方法(二)——xgboost(原理篇)
  15. Qt 实现多语言 国际化 翻译
  16. MATLAB实现追赶法
  17. Win7自带驱动备份功能使用教程
  18. mysql密码过期批处理_批处理脚本一键重置mysql的root密码
  19. go beego在apache服务器上域名配置 --小丑
  20. 采用bitly压缩url

热门文章

  1. 可以看计算机专业书籍的app,分享两个好用的读书APP
  2. xilinx PCIe PIO工程仿真及验证
  3. unity3d 虚拟博物馆_基于Unity3d的博物馆移动信息化系统
  4. 国开网电大 动物常见病防治 形考任务1-5
  5. Amy Cuddy: Your body language shapes who you are
  6. (五)工作中,工作外
  7. 希捷硬盘无法安全弹出如何解决?
  8. Java实现一个打飞机的小游戏【附源码】
  9. 1949-2017闰年 c语言,1949年到2017年里有多少个闰年,多少个平年
  10. mysql执行计划详解