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 倒序排列java stream
List<Double> salesData = new ArrayList<>();
java8 stream多字段排序
List<;类> rankList = new ArrayList<>(); 代表某个集合
//返回对象集合以类属性⼀升序排序
rankList.stream().sorted(Comparatorparing(类::属性⼀));
//返回对象集合以类属性⼀降序排序注意两种写法
rankList.stream().sorted(Comparatorparing(类::属性⼀).reversed()); //先以属性⼀升序,然后对结果集进⾏属性⼀降序
rankList.stream().sorted(Comparatorparing(类::属性⼀, verseOrder())); //以属性⼀降序
//返回对象集合以类属性⼀升序属性⼆升序
rankList.stream().sorted(Comparatorparing(类::属性⼀).thenComparing(类::属性⼆));
//返回对象集合以类属性⼀降序属性⼆升序注意两种写法
rankList.stream().sorted(Comparatorparing(类::属性⼀).reversed().thenComparing(类::属性⼆));//先以属性⼀升序,升序结果进⾏属性⼀降序,再进⾏属性⼆升序rankList.stream().sorted(Comparatorparing(类::属性⼀,verseOrder()).thenComparing(类::属性⼆));//先以属性⼀降序,再进⾏属性⼆升序
//返回对象集合以类属性⼀降序属性⼆降序注意两种写法
rankList.stream().sorted(Comparatorparing(类::属性⼀).reversed().thenComparing(类::属性⼆,
rankList.stream().sorted(Comparatorparing(类::属性⼀).reversed().thenComparing(类::属性⼆).reversed());//先以属性⼀升序,升序结果进⾏属性⼀降序,再进⾏属rankList.stream().sorted(Comparatorparing(类::属性⼀).thenComparing(类::属性⼆,verseOrder()));//先以属性⼀升序,再进⾏属性⼆降序
注意两种写法
1、 Comparatorparing(类::属性⼀).reversed();
2、 Comparatorparing(类::属性⼀,verseOrder());
两种排序是完全不⼀样的,⼀定要区分开来:⽅式1是得到排序结果后再排序,⽅式2是直接进⾏排序⽅式2更好理解。
其他同类知识点:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。