您现在的位置是:首页 > 正文

java8 stream多字段排序

2024-04-01 02:52:29阅读 2

很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理

使用java8新特性,下面先来点基础的

List<类> list; 代表某集合
//返回 对象集合以类属性一升序排序
list.stream().sorted(Comparator.comparing(类::属性一));
//返回 对象集合以类属性一降序排序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行属性一降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));//以属性一降序
//返回 对象集合以类属性一升序 属性二升序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二));
//返回 对象集合以类属性一降序 属性二升序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二));//先以属性一升序,升序结果进行属性一降序,再进行属性二升序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二));//先以属性一降序,再进行属性二升序
//返回 对象集合以类属性一降序 属性二降序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,升序结果进行属性一降序,再进行属性二降序
list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一降序,再进行属性二降序
//返回 对象集合以类属性一升序 属性二降序 注意两种写法
list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性   二,Comparator.reverseOrder()));//先以属性一升序,再进行属性二降序

通过以上例子我们可以发现

  1. Comparator.comparing(类::属性一).reversed();
  2. Comparator.comparing(类::属性一,Comparator.reverseOrder());

两种排序是完全不一样的,一定要区分开来 1 是得到排序结果后再排序,2是直接进行排序,很多人会混淆导致理解出错,2更好理解,建议使用2

实际例子:

现有一个类test 有两个属性:state 状态 time 时间,需要状态顺序且时间倒序

class test {
    //状态
    private int state;
    //时间
    private Date time;
    public test(int state, Date time) {
        this.state = state;
        this.time = time;
    }
 
    public int getState() {
        return state;
    }
 
    public void setState(int state) {
        this.state = state;
    }
 
    public Date getTime() {
        return time;
    }
 
    public void setTime(Date time) {
        this.time = time;
    }
 
    @Override
    public String toString() {
        return "test{" +
                "state=" + state +
                ", time=" + DateUtils.formatDateYMD(time) +
                '}';
    }
}
  
class testRun {
    public static void main(String[] args) {
        List<test> testList = new ArrayList<>();
        Date d = DateUtils.now();
        for (int i = 1; i <= 3; i++) {
            test t = new test(i, DateUtils.addDays(d, i));
            testList.add(t);
        }
        for (int i = 1; i <= 3; i++) {
            test t = new test(i, DateUtils.addMonths(d, i));
            testList.add(t);
        }
 
        testList.forEach(o -> {
            System.out.println(o.toString());
        });
        List<test> sort = testList.stream().sorted(Comparator.comparing(test::getState).thenComparing(test::getTime,Comparator.reverseOrder())).collect(toList());
        System.out.println("------------------------------------");
        sort.forEach(o -> {
            System.out.println(o.toString());
        });
 
 
    }
}

运行结果:
排序前:

test{state=1, time=2019-07-24}
test{state=2, time=2019-07-25}
test{state=3, time=2019-07-26}
test{state=1, time=2019-08-23}
test{state=2, time=2019-09-23}
test{state=3, time=2019-10-23}

排序后:

test{state=1, time=2019-08-23}
test{state=1, time=2019-07-24}
test{state=2, time=2019-09-23}
test{state=2, time=2019-07-25}
test{state=3, time=2019-10-23}
test{state=3, time=2019-07-26}
 
Process finished with exit code 0

转载自:“https://www.cnblogs.com/kuanglongblogs/p/11230250.html”,仅为记录一下,感谢

网站文章

  • 研发工作中感受颇深的一些著名定律

    在书中,我们经常能够看到这样那样的法则、定律。然而真正经历过这些事,回过头来进行深度思考的时候,才越来越觉的这些定律、法则的道理之处。下边简述了一些自己感悟比较深刻的定律,当然还有很多,不断学习,不断经历,不断感悟,不断成长吧。 一,在系统设计时,应该多思考“墨菲定律”: 1,任何事都没有表面看起来那么简单; 2,所有的事都会比你预计的时间长; 3,可能出错的事总会出错; ...

    2024-04-01 02:52:20
  • 2012-01-31 学习笔记

    1.   Comprehend V$PROCESS VIEW2.   Comprehend PSEUDO PROCESS3.   Comprehend Database Process and how to related Operation System Process4.   Comprehend V$SESSION and V$PROCESS of relation5

    2024-04-01 02:52:13
  • 二叉树从根节点到r所指节点之间的路径并输出算法【C/C++】

    二叉树从根节点到r所指节点之间的路径并输出算法【C/C++】

    二叉树从根节点到r所指节点之间的路径并输出算法

    2024-04-01 02:51:31
  • 安卓相关测试

    安卓相关测试

    环境准备:网易Mumu安卓模拟器,里面还有adb方便调试: http://mumu.163.com/baidu/adb: brew cask install android-platform-tools动态调试adb连接,mac下网易mumu端口是5555,windows下是7555windows下:adb connect 127.0.0.1:7555adb shell...

    2024-04-01 02:51:24
  • SGI STL学习笔记(2):traits编程技法

    traits编程技法

    2024-04-01 02:51:17
  • 深度学习入门

    深度学习入门

    ---恢复内容开始---Softmax函数,或称归一化指数函数是逻辑函数的一种推广。它能将一个含任意实数的K维向量“压缩”到另一个K维实向量中,使得每一个元素的范围都在之间,并且所有元素的和为1。该函数的形式通常按下面的式子给出: forj= 1, …,K.wiki的资料看完了,就感觉softmax的作用只有归一化。cross-entropy loss...

    2024-04-01 02:51:11
  • Java跨域请求代码

    1、get请求的方式get请求中,如果拼接的参数字符串中带有空格,后台会报错无法请求成功,适用于通过属性值查询对象接口。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import j...

    2024-04-01 02:50:29
  • 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)...

    如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)...

    工作中遇到这个问题,问别人解决了。答案在问题的下半部分,仅供参考。http://stackoverflow.com/questions/6501812/how-to-use-danymic-accept-value-in-jqueryui-droppable 点击下载免费的敏捷开发教材:《火星人敏捷开发手册》转载于:https://www.cnblogs.com/JPAORM/...

    2024-04-01 02:50:24
  • 一种有趣的弱监督机器学习问题:比例标签学习(Learning from label proportions)

    一种有趣的弱监督机器学习问题:比例标签学习(Learning from label proportions)

    欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法...

    2024-04-01 02:50:16
  • sublime某些插件出现'Node.js was not find ...' 的解决方法

    丫路径中又中文吧。。step1: find "HTMLPrettify.py" and make a backup, it should be here ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/HTML-CSS-JS\ Prettify/HTMLPrettify.pystep2: line 83, rep

    2024-04-01 02:49:35