下面我们用示例来说明

定义一个类:

@Data
public class TestComparatorComparingMultiple{
    private String sort1; //排序字段1
    private String sort2; //排序字段2

    public TestComparatorComparingMultiple(String sort1, String sort2){
        this.sort1 = sort1;
        this.sort2 = sort2;
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

初始化一个集合:

public static void main(String[] args) {

        List<TestComparatorComparingMultiple> bs = new ArrayList<>();
        bs.add(new TestComparatorComparingMultiple("555","222"));
        bs.add(new TestComparatorComparingMultiple("222","555"));
        bs.add(new TestComparatorComparingMultiple("111","666"));
        bs.add(new TestComparatorComparingMultiple("444","333"));
        bs.add(new TestComparatorComparingMultiple("222","444"));
        bs.add(new TestComparatorComparingMultiple("666","333"));
        bs.add(new TestComparatorComparingMultiple("333","333"));
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

初始顺序: 在这里插入图片描述
通过不同场景来分析排序:

//场景一
List<TestComparatorComparingMultiple> sortResult1 = bs.stream()
                .sorted(Comparator.comparing(TestComparatorComparingMultiple::getSort1)
                        .thenComparing(TestComparatorComparingMultiple::getSort2)
                )
                .collect(Collectors.toList());
 //场景二            
List<TestComparatorComparingMultiple> sortResult2 = bs.stream()
        .sorted(Comparator.comparing(TestComparatorComparingMultiple::getSort1)
                .thenComparing(TestComparatorComparingMultiple::getSort2).reversed()
        )
        .collect(Collectors.toList());
//场景三
List<TestComparatorComparingMultiple> sortResult3 = bs.stream()
        .sorted(Comparator.comparing(TestComparatorComparingMultiple::getSort1).reversed()
                .thenComparing(TestComparatorComparingMultiple::getSort2)
        )
        .collect(Collectors.toList());
//场景四
List<TestComparatorComparingMultiple> sortResult4 = bs.stream()
        .sorted(Comparator.comparing(TestComparatorComparingMultiple::getSort1).reversed()
                .thenComparing(TestComparatorComparingMultiple::getSort2).reversed()
        )
        .collect(Collectors.toList());
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

运行以上得到结果:
场景一:
在这里插入图片描述
结果: sort1 升序 、 sort2 升序
没有reversed()时,第一个字段升序 ,第一个字段相同时 第二个字段按升序

场景二:
在这里插入图片描述
结果: sort1 降序 、 sort2 降序
reversed()在最后一个字段时,第一个字段降序 ,第一个字段相同时 第二个字段按降序 (相当于就是场景一取反)

场景三:
在这里插入图片描述
结果: sort1 降序 、 sort2 升序
reversed()在一个字段时 第一个字段降序 ,第一个字段相同时,第二个字段按升序

场景四:
在这里插入图片描述
结果: sort1 升序、 sort2 降序
reversed()两个字段时,第一个字段升序 , 第一个字段相同时 第二个字段按降序 (相当于就是场景三取反)

综上结果得到:
当reversed()在最后一个字段时,就会将之前的所有排序规则取反(区别SQL中的指定字段排序)。

通过reversed()方法的源码,去理解该逻辑。

 /**
	 * 返回一个该顺序相反比较器
     * Returns a comparator that imposes the reverse ordering of this
     * comparator.
     *
     * @return a comparator that imposes the reverse ordering of this
     *         comparator.
     * @since 1.8
     */
    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

避坑,避坑…
当然 Collections.sort() , java.util.List 下的 sort(Comparator c),也可以排序;

>>
注:本文转载自blog.csdn.net的PlutoZuo的文章"https://blog.csdn.net/PlutoZuo/article/details/134259590"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!