zoukankan      html  css  js  c++  java
  • java 8中列表对象多条件排序

    java 8 新加了 lambda 表达式,当接口是一个 @FunctionalInterface 时可以使用 lambda 表达式代替

     Function典型的应用场景为:A. 1个只有1个方法的接口,避免写匿名类; B. 接受Fuction接口为参数的方法

    1 lambda 函数式编程特性

    函数式接口:Functional Interface. 
    定义的一个接口,接口里面必须 有且只有一个抽象方法 ,这样的接口就成为函数式接口。 
    在可以使用lambda表达式的地方,方法声明时必须包含一个函数式的接口。 

     函数式编程的格式如下几种方式:
        a. 标准方式
        (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
        statment1;
        statment2;
        //.............
        return statmentM;
        }

        b.省略类型
        (param1,param2, ..., paramN) -> {
        statment1;
        statment2;
        //.............
        return statmentM;
        }
        
        c.参数为1个时,可用省略参数小括号
        param1 -> {
        statment1;
        statment2;
        //.............
        return statmentM;
        }
        
        d. 语句只有一条时,可省略语句大括号
        param1 -> statment

    2. 方法引用

    如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。 
    Comparator byName = Comparator.comparing(Person::getName); 
    方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
    类型     示例
    引用静态方法     ContainingClass::staticMethodName
    引用某个对象的实例方法     containingObject::instanceMethodName
    引用某个类型的任意对象的实例方法     ContainingType::methodName
    引用构造方法     ClassName::new
        
    静态方法引用例子:

      String::valueOf   等价于lambda表达式 (s) -> String.valueOf(s)

      Math::pow       等价于lambda表达式  (x, y) -> Math.pow(x, y);    

    3 Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:

    Predicate<T>——接收T对象并返回boolean
    Consumer<T>——接收T对象,不返回值
    Function<T, R>——接收T对象,返回R对象
    Supplier<T>——提供T对象(例如工厂),不接收值
    UnaryOperator<T>——接收T对象,返回T对象
    BinaryOperator<T>——接收两个T对象,返回T对象

    那么在参数为这些接口的地方,我们就可以直接使用lambda表达式了!

    4 简单例子

    Person 类有 name、age

    import org.apache.commons.lang3.builder.ToStringBuilder;
    import com.huitong.actdemo1.util.PinyinUtil;
    public class Person {
        
        private String name;
        private Integer age;
        
        public Person() {
        }
        
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this);
        }
        
        public String getNamePinyin() {
            return PinyinUtil.toPinyin(name);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }

    现在要一个需求,一个List 先按照名字的拼音排序,然后按照年龄排序

    public static void main(String[] args) {
            
            List<Person> persons = getPersons();
            
            long start = System.currentTimeMillis();
    //        List<Person> result = persons.stream().sorted(Comparator.comparing(Person::getNamePinyin).thenComparing(Person::getAge)).collect(Collectors.toList());
            List<Person> result = persons.stream()
                    .sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
                            .thenComparing(Person::getAge)).collect(Collectors.toList());
            long end = System.currentTimeMillis();
            
            System.out.println("duration time:" + (end-start) + "ms");
            
            for(Person p: result) {
                System.out.println(p);
            }
    
        }
        
        public static List<Person> getPersons() {
            List<Person> persons = new ArrayList<>();
            persons.add(new Person("中国", 24));
            persons.add(new Person("中国", 23));
            persons.add(new Person("中国", 78));
            persons.add(new Person("美国", 23));
            persons.add(new Person("泰国", 23));
            persons.add(new Person("韩国", 23));
            persons.add(new Person("日本", 23));
            
            return persons;
        }

    两种方法都可以。

    Comparator.comparing()方法接受一个 Function 参数,可以使用lambda 表达式、也可以使用方法引用方式。

    参考文献:

    https://blog.csdn.net/blacksoil55/article/details/78359045

    https://blog.csdn.net/jinzhencs/article/details/50748202

  • 相关阅读:
    [转]ExtJS之遍历Store
    [转]Ext ComboBox 默认选中某一项
    [转]extjs render 用法介绍
    [转]Extjs combo数据绑定与获取
    [转]ExtJs:xtype的含义
    java 使用POI批量导入excel数据
    面临读研,找工作杂感
    二维“有序”数组查找问题的解决
    操作系统——进程调度之短进程优先
    阶乘相关问题
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/9462876.html
Copyright © 2011-2022 走看看