Stream(2)--使用流

1. 筛选、切片和映射

1.1 筛选

  • 用谓词筛选--filter
  • 去重--distinct(根据流所生成元素的hashCode和equals方法)

1.2 流的切片

  • 什么叫切片:选择或跳过或截短流中的某些元素

1.2.1 使用谓词(java 9

  • takeWhile:发现第一个不满足条件的元素就停止
    List<Dish> result = lists.Stream.takeWhile(dish ->dish.getCalories < 320 ).collect(toList);
    
  • dropWhile:丢弃所有谓语结果为false的元素,一旦遇到为true的情况就停止并返回剩余所有元素

1.2.2 截短

  • limit(n):返回另一个不超过n的流

1.2.3 跳过

  • skip(n):返回一个扔掉前n个元素的流

1.3 映射

1.3.1 对流中每个元素应用函数

  • map接受一个函数,把元素映射成一个新的元素
    • 注意:是创建一个新副本,而不是修改

1.3.2 扁平化

  • 将多个流合并为一个流

2. 查找、匹配和归约

2.1 匹配

  • anyMatch :返回Boolean,因此是一个终端操作。 检查谓词是否至少匹配一个元素
  • allMatch:匹配所有
  • noneMatch
    以上几个都使用短路操作

2.2 查找

  • findAny:返回当前流中任意元素
  • findFirst:返回第一个

2.3 归约

2.3.1 什么是归约

流中所有元素反复结合起来,得到一个值。比如你把流中的1、2、3、4叠加得到的值的操作就是归约

  • reduce:接受两个参数:一个初始值,一个BinaryOperator<T>来将两个元素结合产生一个新值
    • 无初始值时,返回一个Option对象

3. 使用数值范围等数据流

3.1 原始类型流特化:避免装箱成本

  • IntStream、DoubleStream、LongStream
  • 将流转化为特定版本
lists.Stream().mapToInt()....
  • 转回对象流
intStram.boxed()
  • OptionalInt--针对IntStream的返回值存不存在

3.2 数值范围流

  • IntStream和LongStream的range和rangeClosed方法,用来生成数值范围流。第一个参数接收起始值,第二个接收结束值,rang不包含结束值,rangeClosed包含结束值

4.从多个源创建流

4.1 从值创建流

  • Stream.of(值)
  • Stream.empty()创建空流

4.2 从可空对象创建流(java9

  • Stream.ofNullable()

4.3 从数组创建流

  • Arrays.stream(数组)

4.4 从文件创建流

  • Files.lins()
  • Stream接口通过实现AutoCloseable接口,解决之前使用I/O资源必须用finally关闭的问题,Stream会自己关闭

5. 无限流

  • 函数生成无限流
  • Stream.iterate
  • Stream.gengrate
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容