为什么要了解和使用拉姆达——走进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;}}


0 0
原创粉丝点击