zoukankan      html  css  js  c++  java
  • Java中的排序问题(Java8新特性 stream流、stream多字段排序)

    1、概要

            Java 8 API添加了一个新的抽象成为流Stream,它以一种声明的方式处理数据,最后由最终操作得到前面处理的结果。

            Stream专注于集合对象的操作,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

            Stream在处理大批量数据操作中更加高效。

            Stream + Lambda 表达式可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

      stream的三大特性:1、不存储数据;2、不改变源数据;3、延时执行。

      stream优点:1、简化代码;2、使用并行流可以利用多核特性,提升效率。

      stream上的所有操作分为两类:中间操作和结束操作,中间操作只是一种标记,只有结束操作才会触发实际计算。

    2、什么是流

            Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如,“过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

    而和迭代器又不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个item读完后再读下一个item。而使用并行去遍历时,数据会被分成多个段,其中每个段在不同的线程中处理,然后将结果一起输出。Stream的并行操作依赖于Java7中引入的Fork/Join框架(JSR166y)来拆分任务和加速处理过程。

    Stream 的另外一大特点是,数据源本身可以是无限的。
     

    工作中,经常会需要对集合内的元素进行排序。利用Java8可以很方便的对List内的元素进行排序操作;而在很多情况下sql不好

    解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理。

    List 倒序排列

    List<Double> salesData = new ArrayList<>();
    
    Collections.reverse(salesData);

    java8 stream多字段排序

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

    注意两种写法

    1、 Comparator.comparing(类::属性一).reversed();

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

    两种排序是完全不一样的,一定要区分开来:方式1是得到排序结果后再排序,方式2是直接进行排序!!!方式2更好理解。

    其他同类知识点:

    1、Java8中的Stream()与ParallelStream()的区别;

    2、Java集合Stream类filter的使用

  • 相关阅读:
    [BZOJ1578] [Usaco2009 Feb]Stock Market 股票市场(DP)
    [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
    [BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)
    [BZOJ1574] [Usaco2009 Jan]地震损坏Damage(贪心 + dfs)
    [BZOJ1572] [Usaco2009 Open]工作安排Job(贪心 + 堆)
    [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)
    [luoguP3668] [USACO17OPEN]Modern Art 2 现代艺术2(栈)
    [luoguP3608] [USACO17JAN]Balanced Photo平衡的照片(树状数组 + 离散化)
    [luoguP3110] [USACO14DEC]驮运Piggy Back(SPFA || BFS)
    [BZOJ2342] [Shoi2011]双倍回文(manacher)
  • 原文地址:https://www.cnblogs.com/no8g/p/13415585.html
Copyright © 2011-2022 走看看