排序的传统的写法是:
Collections.sort( SortTest.users, new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); } });
java8里可以有如下实现
/// 第一种法法和它的实现类 SortTest.users.sort((o1, o2) -> o1.getAge() - o2.getAge()); SortTest.users.sort( new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); } }); // 第二种方式和他的实现类 SortTest.users.sort(comparingInt(User::getAge)); SortTest.users.sort( comparingInt( new ToIntFunction<User>() { @Override public int applyAsInt(User value) { return value.getAge(); } }));
看到comparingInt方法后看了下Comparator接口提供的方法,对于单条件排序的方式有很多,甚至提供了针对null的排序,略臃肿,不过很齐全。
对于多条件比较的,例如传统代码
// 根据姓名,年龄,积分排序洗涤 public static void traditionCombinationCompare() { Collections.sort( SortTest.users, new Comparator<User>() { @Override public int compare(User o1, User o2) { if (o1.getName().equals(o2.getName())) { if (o1.getAge().equals(o2.getAge())) { return o1.getAge() - o2.getAge(); } else { return o1.getCredits() - o2.getCredits(); } } else { return o1.getName().compareTo(o2.getName()); } } }); }
在java8中很简洁,第二个表达式是我学习的时候查看每个方法原来的参数及实现
private static void traditionCombinationCompareInJava8() { SortTest.users.sort( comparing(User::getName).thenComparing(User::getAge).thenComparing(User::getCredits)); SortTest.users.sort( comparing( new Function<User, String>() { @Override public String apply(User user) { return user.getName(); } }) .thenComparing( user -> { return user.getAge(); }) .thenComparing(User::getCredits)); SortTest.users.forEach(user -> System.out.println(JSON.toJSONString(user))); }