码迷,mamicode.com
首页 > 其他好文 > 详细

函数式编程+比较器

时间:2018-08-29 10:39:58      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:void   返回   EAP   system   ++   nali   小根堆   sys   oid   

比较器

@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("========================\n");
    }

    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

 

函数式编程+比较器

标签:void   返回   EAP   system   ++   nali   小根堆   sys   oid   

原文地址:https://www.cnblogs.com/fengxilee/p/9552214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!