java8 使用stream进行排序(多字段排序、升序、降序)

文章包含“标题”、“发布时间”、“是否推荐”、“是否置顶”四个属性。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Article {
    /**
     * 文章标题
     */
    private String title;
    /**
     * 发布时间
     */
    private String releaseTime;
    /**
     * 是否推荐:Y 推荐;N 不推荐
     */
    private String recommend;
    /**
     * 是否置顶: Y 置顶;N 不置顶
     */
    private String top;
}

测试代码

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Demo {

    public static void main(String[] args) {
        List<Article> list = init();
        sort(list);
        sort2(list);
    }

    /**
     * 初始化数据
     * @return
     */
    private static List<Article> init(){
        List<Article> list = new ArrayList<>();
        list.add(new Article("文章一","2021-11-01","Y","Y"));
        list.add(new Article("文章二","2021-11-02","Y","Y"));
        list.add(new Article("文章三","2021-11-01","Y","N"));
        list.add(new Article("文章一","2021-11-02","Y","N"));
        list.add(new Article("文章一","2021-11-01","N","Y"));
        list.add(new Article("文章一","2021-11-02","N","Y"));
        list.add(new Article("文章一","2021-11-01","N","N"));
        list.add(new Article("文章一","2021-11-02","N","N"));
        return list;
    }
    ....
}

排序方法

/**
     * 按照推荐、置顶、发布时间来排序
     * @param list
     */
private static void sort(List<Article> list){
    List<Article> sortList = list.stream()
            // 【X】
            .sorted(Comparator.comparing(Article::getRecommend,Comparator.reverseOrder())
                    // 【Y】
                    .thenComparing(Article::getTop,Comparator.reverseOrder())
                    // 【Z】
                    .thenComparing(Article::getReleaseTime,Comparator.reverseOrder()))
            .collect(Collectors.toList());
    sortList.stream().forEach(System.out::println);
}
//        运行结果:
//        Article(title=文章二, releaseTime=2021-11-02, recommend=Y, top=Y)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=Y, top=Y)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=Y, top=N)
//        Article(title=文章三, releaseTime=2021-11-01, recommend=Y, top=N)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=Y)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=Y)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=N)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=N)

  • 【X】:优先使用recommend字段排序,并且使用降序排列(Comparator.reverseOrder()),在结果中的体现是前四篇文章的recommend为‘Y’,后四篇的recommend为‘N’

  • 【Y】:之后再使用top字段排序,并且使用降序排列(Comparator.reverseOrder()), 在结果中的体现是recommend相同的文章中,前两篇文章的top为‘Y’, 后两篇文章的top为‘N’

  • 【Z】:最后使用发布时间字段进行排序,并且使用降序排列(Comparator.reverseOrder())

两种倒序方式

Comparator.comparing(类::属性,Comparator.reverseOrder())
/**
     * 按照推荐、置顶、发布时间来排序
     * @param list
     */
private static void sort(List<Article> list){
    List<Article> sortList = list.stream()
            // 【X】
            .sorted(Comparator.comparing(Article::getRecommend,Comparator.reverseOrder())
                    // 【Y】
                    .thenComparing(Article::getTop,Comparator.reverseOrder())
                    // 【Z】
                    .thenComparing(Article::getReleaseTime,Comparator.reverseOrder()))
            .collect(Collectors.toList());
    sortList.stream().forEach(System.out::println);
}
//        运行结果:
//        Article(title=文章二, releaseTime=2021-11-02, recommend=Y, top=Y)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=Y, top=Y)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=Y, top=N)
//        Article(title=文章三, releaseTime=2021-11-01, recommend=Y, top=N)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=Y)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=Y)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=N)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=N)

以传入的字段进行倒序排列

  • 【X】:这里就类似于mysql中的 order by recommend desc

  • 【Y】:结合【X】就是order by recommend desc, top desc

Comparator.comparing(Article::getRecommend,Comparator.reverseOrder()).reversed()
private static void sort2(List<Article> list){
    List<Article> sortList = list.stream()
            .sorted(Comparator.comparing(Article::getRecommend,Comparator.reverseOrder())
                    .thenComparing(Article::getTop,Comparator.reverseOrder())
                    .thenComparing(Article::getReleaseTime,Comparator.reverseOrder()).reversed()) // 【X】
            .collect(Collectors.toList());
    sortList.stream().forEach(System.out::println);
}
//        运行结果:
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=N)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=N)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=N, top=Y)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=N, top=Y)
//        Article(title=文章三, releaseTime=2021-11-01, recommend=Y, top=N)
//        Article(title=文章一, releaseTime=2021-11-02, recommend=Y, top=N)
//        Article(title=文章一, releaseTime=2021-11-01, recommend=Y, top=Y)
//        Article(title=文章二, releaseTime=2021-11-02, recommend=Y, top=Y)
  • 【X】:这里的reversed()是将之前的排序进行整个倒序,可以发现这个方法的运行结果和上一个运行方法的运行结果是完全相反的
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo的心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值