Java Comparator comparingInt() 的使用

comparingInt

static <T> Comparator<T> comparingInt​(ToIntFunction<? super T> keyExtractor)
接受提取一个函数int从类型分类键T ,并返回一个Comparator ,通过该排序关键字进行比较。
如果指定的功能也可串行化,则返回的比较器是可序列化的。 (摘自API)

  • 参数类型
    T - 要比较的元素的类型

  • 参数
    keyExtractor - 用于提取整数排序键的函数

  • 结果
    比较器,其被提取的密钥进行比较

  • 异常
    NullPointerException - 如果参数为空

API Note:
例如,要获得一个Comparator ,它比较了Person对象的姓氏,

> Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);

自定义排序参数

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

// 重写比较器
class Persons implements  Comparable<Persons> {
    String name;
    int age;

    public Persons(String name, int age) {
        this.name = name;
        this.age = age;
    }
	
	// 定义此方法接受单个参数keyExtractor,该参数是用于提取整数排序键的函数
    public int getAge() {
        return this.age;
    }

    // 按姓氏ASCII降序,反过来升序
    @Override
    public int compareto(Persons o) {
        return this.name.compareto(o.name);
    }
}

public class ComparatorTest {
    public static void main(String[] args) {
        // create some Persons objects
        Persons p1 = new Persons("B", 10);
        Persons p2 = new Persons("D", 20);
        Persons p3 = new Persons("A", 18);

        // before sort
        List<Persons> list = Arrays.asList(p2, p1, p3);
        System.out.println("Before Sort:");
        list.forEach(Persons -> System.out.println("Persons name"+Persons.name));

        // 自定义比较器
        Comparator<Persons> byAge = Comparator.comparingInt(Persons::getAge);
        Collections.sort(list, byAge);
        System.out.println("After Sort:");
        list.forEach(Persons -> System.out.println("Persons age"+Persons.age));
    }
}

结果

Before Name Sort:
Persons nameD
Persons nameB
Persons nameA

After Age Sort:
Persons nameB
Persons nameA
Persons nameD

优先队列,重写比较器

 // 定义优先队列,修改认升序的排序关键字 key
PriorityQueue<int[]> minHeap = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));

后序

请参考Java Arrays.asList() 的避雷

请参考Java中 forEach() 和 Iterator 与 增强for循环 的那些事儿

参考大佬文章,及官方API,向优秀的人致敬!

加油!

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...