Java8新特性Stream流、Stream多字段排序

导语

Java 8 API添加了一个新的抽象成为流Stream,它以一种声明的方式处理数据,最后由最终操做获得前面处理的结果。
Stream专一于集合对象的操做,将要处理的元素集合看做一种流, 流在管道中传输, 而且能够在管道的节点上进行处理, 好比筛选, 排序,聚合等。
Stream在处理大批量数据操做中更加高效。算法
Stream + Lambda 表达式能够极大提升Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
Stream的三大特性:一、不存储数据;二、不改变源数据;三、延时执行。
Stream优势:一、简化代码;二、使用并行流能够利用多核特性,提高效率。
Stream上的全部操做分为两类:中间操做和结束操做,中间操做只是一种标记,只有结束操做才会触发实际计算。

什么是流(Stream)

Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操做;高级版本的Stream,用户只要给出须要对其包含的元素执行什么操做,例如:“过滤掉长度大于 10 的字符串”、"获取每一个字符串的首字母"等等,Stream会隐式地在内部进行遍历,作出相应的数据转换。Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了。
但是和迭代器(Iterator)又不一样的是,Stream能够并行化操做,迭代器只能命令式地、串行化操做。顾名思义,当使用串行方式去遍历时,每一个item读完后再读下一个item。而使用并行去遍历时,数据会被分红多个段,其中每一个段在不一样的线程中处理,而后将结果一块儿输出。Stream的并行操做依赖于Java7中引入的Fork/Join框架(JSR166y)来拆分任务和加速处理过程。
Stream 的另一大特色是,数据源自己能够是无限的。
工做中,常常会须要对集合内的元素进行排序,利用Java8能够很方便的对List内的元素进行排序操做。

Stream排序

// List倒序排
List<Object> objects = new ArrayList<>();
Collections.reverse(objects);

// 多字段排序
List<> list=new ArrayList<>();

// 返回对象集合以类属性一升序排
list.stream().sorted(Comparator.comparing(::属性一));

// 返回对象集合以类属性一降序排序(注意两种写法)
// 1、先以属性一升序,而后对结果集进行属性一降序
list.stream().sorted(Comparator.comparing(::属性一).reversed()); 
// 2、以属性一降序
list.stream().sorted(Comparator.comparing(::属性一, Comparator.reverseOrder()));

// 返回对象集合以类属性一升序 属性二升序
list.stream().sorted(Comparator.comparing(::属性一).thenComparing(::属性二)); 

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

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

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

两种写法

两种排序是彻底不同的,必须要区分开来:
1、获得排序结果后再排序:
	 Comparator.comparing(类::属性一).reversed();
2、是直接进行排序:
	 Comparator.comparing(类::属性一,Comparator.reverseOrder());
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值