导语

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());

Java8新特性Stream流、Stream多字段排序相关推荐

  1. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  2. JAVA8 新特性-Lamda跟Stream

    JAVA8 新特性-Lamda跟Stream 主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 Jav ...

  3. Java8新特性总结 -5.Stream API函数式操作流元素集合

    所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/T ...

  4. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  5. Java8 新特性之流式数据处理(转)

    转自:https://www.cnblogs.com/shenlanzhizun/p/6027042.html 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作 ...

  6. Java8新特性:使用Stream流递归实现遍历树形结构

    作者:Lcry blog.csdn.net/qq_19244927/article/details/106481777 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示 ...

  7. java8新特性Lambda和Stream以及函数式接口等新特性介绍

    主要内容 1.Lambda 表达式 2.函数式接口 3.方法引用与构造器引用 4.Stream API 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 Java 8新特性简介 速 ...

  8. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  9. JAVA8新特性Optional和Stream和Localdate用法

    1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...

  10. java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作

    2.数据源的获取 2.1.数据源的简介 数据源,顾名思义,既是流中的数据的来源.是集合的流式编程的第一步,将数据源中的数据读取到流中,进行处理.注意:将数据读取到流中进行处理的时候,与数据源中的数据没 ...

最新文章

  1. 【深度学习】Tensorflow搭建卷积神经网络实现情绪识别
  2. K - FatMouse and Cheese
  3. EasyExcel实现写操作
  4. 爬虫:Charles证书设置为系统信任证书(root)
  5. git删除本地分支、删除远程分支 复制分支
  6. 为脚本语言平反-JavaScript篇(3)
  7. geoserver矢量瓦片发服务前端展示偏移问题解决
  8. 35岁遭遇互联网公司无情裁员,面试屡屡碰壁,原因竟是……
  9. C# 中XML序列化与反序列化学习笔记
  10. Java基础-学习笔记(六)——类的封装性
  11. 10的n次方换算关系 10^N 计算机存储单位的换算关系
  12. 使用nginx + uwsgi部署自己的django项目
  13. laravel8 微信小程序(实现简单签到功能)
  14. 2D激光雷达的多传感器拼接
  15. KEIL经常出现 Encountered an improper argument 弹窗
  16. HDMI 之 HPD .
  17. Golang基础(1)
  18. JS汉字转拼音,超级实用
  19. 海思HI3751HiDPTAndroidV200R001 UNF 接口版本差异说明
  20. CRC32的CrackMe

热门文章

  1. matlab求导程序,「matlab求导」matlab 求导的一个简单程序 - 金橙教程网
  2. SPACEMACS 配置
  3. Visual FoxPro已经过时了吗 ?我也经常问自己!
  4. 计算机性能在线测评,电脑性能在线测试
  5. 中标麒麟操作系统离线安装nginx
  6. Obsidian V0.14.6版本下实时渲染总是出Bug,时常渲染不出来
  7. 犀牛脚本插件-添加文本-Python-显示窗口-rhino脚本
  8. BlockUI详细用法
  9. DX9b 与 DX9c 在x文件解析方面带来的麻烦
  10. c语言蜂鸣器放音乐程序,单片机蜂鸣器C语言程序