• 函数式编程+比较器


    比较器

    @FunctionalInterface
    public interface Comparator<T> {

        int compare(T o1, T o2);

    }

    @FunctionalInterface  指的是功能性函数接口,里面只有一个方法。    

    对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等

    public class Demo {
        public static class Student {
            public String name;
            public int id;
            public int age;
    
            public Student(String name, int id, int age) {
                this.name = name;
                this.id = id;
                this.age = age;
            }
            @Override
            public String toString() {
                return "Name : " + this.name + ", Id : " + this.id + ", Age : " + this.age;
            }
        }
        
        public static Student[] create(){
            return new Student[] { 
                    new Student("A", 1, 23),
                    new Student("B", 2, 21),
                    new Student("C", 2, 20),
                    new Student("E", 2, 19),
                    new Student("D", 2, 29),
                    new Student("F", 1, 24)
            };
        }
        
        public static void printArr(Student[] array){
            for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
            }
            System.out.println("========================
    ");
        }
    
        public static void main(String[] args) {
            printArr(create());
        }
    }

    基础类Student被create()实例化为数组形式,通过printArr打印Student的信息。

    比较器

    在Demo中实现Comparator接口

        public static class AgeDescendingComparator implements Comparator<Student> {
    
            @Override
            public int compare(Student o1, Student o2) {
                return o2.age - o1.age;
            }
    
        }

    然后就是在main方法中引用,

        public static void main(String[] args) {
            Student[] students = create();
            printArr(students);
            Arrays.sort(students, new AgeDescendingComparator());
            printArr(students);
        }

    结果为学生年龄降序排列:

    Name : A, Id : 1, Age : 23
    Name : B, Id : 2, Age : 21
    Name : C, Id : 2, Age : 20
    Name : E, Id : 2, Age : 19
    Name : D, Id : 2, Age : 29
    Name : F, Id : 1, Age : 24
    ========================

    Name : D, Id : 2, Age : 29
    Name : F, Id : 1, Age : 24
    Name : A, Id : 1, Age : 23
    Name : B, Id : 2, Age : 21
    Name : C, Id : 2, Age : 20
    Name : E, Id : 2, Age : 19
    ========================

    函数值编程

    但是每次都要自定义类实现comparator接口,过于繁杂,有关函数式接口的其他应用,网上有很多。

    在main中

    Comparator<Student> nameAort = (st1,st2) -> {return st1.name.compareTo(st2.name);};

    在构建以年龄排序的小根堆

            PriorityQueue<Student> heap = new PriorityQueue<>(nameAort);// 小根堆
            for (int i = 0; i < students.length; i++) {
                heap.add(students[i]);
            }
            while (!heap.isEmpty()) {
                Student student = heap.poll();
                System.out.println(student);
            }

    现在到底结果

    Name : A, Id : 1, Age : 23
    Name : B, Id : 2, Age : 21
    Name : C, Id : 2, Age : 20
    Name : D, Id : 2, Age : 29
    Name : E, Id : 2, Age : 19
    Name : F, Id : 1, Age : 24

  • 相关阅读:
    磁盘分区,fdisk,gdisk,开机自动挂载,swap分区,修复文件系统,备份文件
    进程脱离窗口运行,僵尸、孤儿进程
    top命令、kill命令
    进程状态
    rpm包、挂载、yum命令
    DRF源码分析
    forms组件源码
    Django CBV源码分析
    魔法方法
    鸭子类型
  • 原文地址:https://www.cnblogs.com/fengxilee/p/9552214.html
Copyright © 2020-2023  润新知