为什么要了解和使用拉姆达——走进Java Lambda(〇)
来源:互联网 发布:php银联支付 编辑:程序博客网 时间:2024/05/21 18:29
为什么要了解和使用拉姆达
原因一:为了充分利用电脑多核的特性。由于一般的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中的“男”性人数进行统计。
旧代码可能会这样写:
<pre name="code" class="java"> 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(〇)
- lambda表达式的实质——什么是lambda表达式,为什么要使用lambda表达式
- 从Java5基础开始初识Lambda表达式——走进Java Lambda(一)
- 一起走进Java虚拟机的世界 —— 为什么要弄懂虚拟机
- Stream Java8的集合类利器——走进Java Lambda(二)
- Java8中的[方法引用]“双冒号”——走进Java Lambda(四)
- Java8用Optional 让“空”中的攻城狮接地气——走进Java Lambda(五)
- Stream Java8的集合类利器——走进Java Lambda(二)
- Stream Java8的集合类利器——走进Java Lambda
- Java8中的[方法引用]“双冒号”——走进Java Lambda(四)
- 为什么 Kotlin 调用 java 时可以使用 Lambda? —— SAM 转换机制的介绍
- 为什么Java要增加lambda表达式
- Java8引入函数接口,与原有接口多重继承带来的缺陷——走进Java Lambda(三)
- Lambda表达式全面了解——通俗易懂
- 走进java_了解ArrayList和LinkedList
- lambda-为什么要boxed
- 零基础学python-18.7 为什么要使用lambda表达式
- Java——函数式接口和lambda表达式
- Java枚举类
- 中水处理设备:中水处理设备工艺流程详细说明
- Java探索之旅(13)——字符串类String
- Struts2整合Spring Hibernate的CRUD实例
- [INS-40406] The installer detects no existing Oracle Grid Infrastructure software on the system.
- 为什么要了解和使用拉姆达——走进Java Lambda(〇)
- mkdir -p
- UVA - 10755 Garbage Heap(最大子矩阵)
- C++中的Lambda表达式
- C#异常处理的一般法则
- 调用函数求特殊三位数
- java中final修饰符用法
- UIApplication详解(转载)
- poj 3252 Round Numbers (组合数学)