Java提供了一个用于比较的接口Comparable, 通过实现compareTo的方法来实现对于容器外部类的比较方法,所有实现该接口的类,都动态的实现了该比较方法,Java中同样提供了一个关于容器排序的接口Comparator,主要是通过类的内部属性进行一个比较然后对其进行比较,本篇文章主要分析比较了Comparator在Java7 Java8 Groov当中的不同写法。
Java7
先声明一个要用来排序的User类
@ToString
@Setter
@Getter
class User {
String name;
Integer age;
}
Listlists = new ArrayList<>(); User user1 = new User(); User user2 = new User(); User user3 = new User(); user1.setName("user1"); user1.setAge(18); user2.setName("user2"); user2.setAge(19); user3.setName("user3"); user3.setAge(20); lists.add(user1); lists.add(user2); lists.add(user3);
看一下现在lists里面的顺序
[User(name=user1, age=18), User(name=user2, age=19), User(name=user3, age=20)]
按照年龄从大到小排个序
lists = lists.stream().sorted(new Comparator() { @Override public int compare(User o1, User o2) { return o2.getAge() - o1.getAge() > 0 ? 1 : -1; } }).collect(Collectors.toList());
结果
[User(name=user3, age=20), User(name=user2, age=19), User(name=user1, age=18)]
Java8
我们再来看一下Java8的写法,其他都不变,主要是排序方法
lists = lists.stream().sorted(((o1, o2) -> (o2.getAge() - o1.getAge() > 0 ? 1 : -1))).collect(Collectors.toList());
总结
Java 8 希望有自己的编程风格,并与 Java 7 区别开, 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
Groovy
@groovy.transform.ToString
class User {
String name;
Integer age;
}
User user1 = new User(name: 'user1', age: 18)
User user2 = new User(name: 'user1', age: 19)
User user3 = new User(name: 'user1', age: 20)
def lists = [user1, user2, user3]
lists.sort { a, b -> b.age <=> a.age }



