zoukankan      html  css  js  c++  java
  • (2)传递代码

    java8之前,java只允许传基础数值或者对象的引用,而现在java允许传代码了。

    接下来还是以Comparator来举例。

    //匿名内部类
    @Test
    public void java8Test() {
        Person p1 = new Person(22);
        Person p2 = new Person(23);
        Person p3 = new Person(21);
        Person p4 = new Person(20);
        List<Person> list = Lists.newArrayList(p1, p2, p3, p4);
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //两个数判断大小不要直接相减,如果减一个负数得到的值可能会超出范围,从而返回负数
                return Ints.compare(o1.getAge(), o2.getAge());//guava提供的方法
            }
        });
        System.out.println(list);
    }
    //传递代码(lambda表达式)
    @Test
    public void java8Test() {
        Person p1 = new Person(22);
        Person p2 = new Person(23);
        Person p3 = new Person(21);
        Person p4 = new Person(20);
        List<Person> list = Lists.newArrayList(p1, p2, p3, p4);
        Collections.sort(list, (Person person1, Person person2) -> {
            return Ints.compare(person1.getAge(), person2.getAge());
        });
        System.out.println(list);
    }

    对于减少代码来说,效果并不是很明显,但是他有一个令人惊喜的事情是他并没有创建一个匿名内部类,而是将方法传了过去,让比较器通过这个方法来比较。不过上述表达式是最完整的一种方式,

    也是表达最清楚的方式,但却是写起来比较麻烦的方式。因为Comparator只有一个抽象方法(这种接口叫做函数式接口,这种函数式接口,方便了lambda表达式的简化),并且List的类型已经确定,编译器是可以通过上下午判断出传入的类型的,所以可以省略掉显示制定类型,并且只有一行代码,{}和return也是可以省略掉的。

    Collections.sort(list, (person1, person2) -> Ints.compare(person1.getAge(), person2.getAge()));
     
    优化完的代码,看起来会觉得很奇怪,但是比匿名内部类代码少的多,当然用idea来写代码,用匿名内部类是非常快的写出来的,但是以后的阅读,lambda还是比匿名内部类要好。

     

  • 相关阅读:
    移动端rem.js及移动端的一些属性和事件
    win10下nodejs的安装及配置
    $.ajax()在IE9下的兼容性问题
    H5 video自定义视频控件
    js表格排序
    [转]jQuery不同版本区别
    移动端H5多终端适配解决方案
    一个目录结构
    Linux学习
    Python3基础笔记---线程与进程
  • 原文地址:https://www.cnblogs.com/zhandouBlog/p/9383228.html
Copyright © 2011-2022 走看看