文章目录

  • 一、Stream简介
  • 二、Stream API
    • 2.1 筛选和切片
      • 2.1.1 filter
      • 2.1.2 distinct
      • 2.1.3 limit(n)
      • 2.1.4 skip(n)
    • 2.2 映射
      • 2.2.1 map
      • 2.2.2 flatMap
    • 2.3 查找和匹配
      • 2.3.1 anyMatch
      • 2.3.2 allMatch
      • 2.3.3 noneMatch
      • 2.3.4 findAny
      • 2.3.5 findFirst
    • 2.4 归约
      • 2.4.1 reduce
    • 2.5 其他
      • 2.5.1 of
      • 2.5.2 empty
      • 2.5.2 concat
      • 2.5.3 peek

祸兮,福所依;福兮,祸所伏。


一、Stream简介

什么是流?

简单说,流是从集合中计算得来的一组元素序列。

集合与流之间的差异就在于什么时候进行计算:
集合是一个内存中的数据结构,它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。
相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素是按需计算的。

二、Stream API

2.1 筛选和切片

2.1.1 filter

筛选元素,例:筛选字符长度>3的元素

// 返回"three","four"
Stream.of("one", "two", "three", "four").filter((e) -> e.length() > 3);

2.1.2 distinct

元素去重

// 返回元素"one","three","four"
Stream.of("one", "one", "three", "four").distinct();

2.1.3 limit(n)

返回前n条数据

// 返回元素"one","two"
Stream.of("one", "two", "three", "four").limit(2);

2.1.4 skip(n)

跳过前 n 条数据

// 返回元素"three","four"
Stream.of("one", "two", "three", "four").skip(2);

2.2 映射

2.2.1 map

通常用于将一个类型转换成另外一个类型,也可以是同类型

// 将每个元素映射成大写
Stream.of("one", "two", "three", "four").map(String::toUpperCase);
// User  ->  UserDTO
User user = new User();
Stream<UserDTO> userDTOStream = Stream.of(user).map((u) -> {UserDTO dto = new UserDTO();BeanUtils.copyProperties(u, dto);return dto;});

补充:

mapToInt,将元素转换成int类型, 返回IntStream
mapToLong,将元素转换成long类型,返回LongStream
mapToDouble,将元素转换成double类型,返回DoubleStream

在操作原始数值类型时,最好使用原始类型特化流,因为这些流将元素特化为int、long、double等基本类型,从而避免了进行数值计算时,暗含的装箱、拆箱成本。

2.2.2 flatMap

流的扁平化。flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
它比较适用于Stream中元素是一个集合或数组的情况,比如:
Stream<String[]>

举个例子:words 数组元素为 {“one”,“two”,“three”},目标时将words以字符格式输出,即:‘o’ ‘n’ ‘e’ …

String[] words = {"one","two","three"};
Stream<String> stream = Stream.of(words);
// 分割字符串
Stream<String[]> stream1 = stream.map(e -> e.split(""));
// 将Stream<String[]> 转换成 Stream<String>
Stream<String> stringStream = stream1.flatMap(e -> Arrays.stream(e));stringStream.collect(Collectors.toList()).forEach(s -> System.out.print(s + " "));

说起来,flatMap有点像双层for循环,它可以对stream流中单个元素再进行拆分。

补充:

flatMapToInt,将元素扁平成int类型
flatMapToLong,将元素扁平成long类型
flatMapToDouble,将元素扁平成double类型

2.3 查找和匹配

2.3.1 anyMatch

流中是否有一个元素能匹配

2.3.2 allMatch

是否匹配所有元素

2.3.3 noneMatch

流中没有任何元素匹配

2.3.4 findAny

查找元素,返回当前流中的任意元素

2.3.5 findFirst

查找第一个元素

2.4 归约

2.4.1 reduce

reduce方法可以用在数字求和、乘积等场景。
它的作用是每次计算的时候都用到上一次的计算结果,比如求和操作:前两个数的和加上第三个数的和,一直加到最后一个数位置,最后返回结果。

  int sum = IntStream.of(3, 4, 8).reduce(0, (a, b) -> a + b);

当然,这里用IntStream的sum方法更好

 int sum = IntStream.of(3, 4, 8).sum();

2.5 其他

2.5.1 of

可接受一个泛型对象或可变泛型对象集合,返回一个Stream对象

 Stream<String> stream = Stream.of("a", "b", "c");

2.5.2 empty

创建一个空的Stream对象

  Stream<Object> empty = Stream.empty();

2.5.2 concat

连接两个Stream,返回一个新的Stream

 Stream<String> a = Stream.of("a","b","c");Stream<String> b = Stream.of("d","e");Stream<String> c = Stream.concat(a,b);// 输出:abcdec.collect(Collectors.toList()).forEach(System.out::print);

2.5.3 peek

peek:窥视,窥探;
java源码中对这个方法进行了详细描述
简单说:这个方法的存在主要是为了支持调试

java源码提供的案例如下:

Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());

输出结果:

Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

这个方法的好处在于,我们可以在执行Stream的filter、map或者其他操作之后可以查看到数据执行的结果。

java8新特性——Stream流相关推荐

  1. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  2. java8新特性stream流

    参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...

  3. Java8新特性——Stream流:不同于IO流的流,操作集合数据

    文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...

  4. 【Stream】java8新特性Stream流总结

    一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...

  5. java8新特性 Stream流的优雅操作

    1. 使用传统的方式,遍历集合,对集合中的数据进行过滤 //创建一个List集合,存储姓名List<String> list = new ArrayList<>();list. ...

  6. Java8新特性stream流的优雅操作

    文章目录 原因是因为我管理的小组提交代码被我review到了,发现只有个别同学使用到了stream流,所以出此blog,希望大家都写出优雅的代码 原因是因为我管理的小组提交代码被我review到了,发 ...

  7. 利用Java8新特性stream流给集合中的某个属性赋值

    今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...

  8. Java8新特性 Stream流常用方法

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...

  9. Java8新特性 stream流常用方法

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...

  10. java8新特性-Stream流

    直接贴代码: package com.c8a.stream;import lombok.AllArgsConstructor; import lombok.Data; import lombok.No ...

最新文章

  1. 3.2-3.3 Hive中常见的数据压缩
  2. 考研英语一2016年真题4篇阅读词汇句子积累(详细!!!)
  3. Redis 6.0 新特性:多线程连环 13 问!
  4. 【C++入门】简单的日期类操作
  5. Python的lambda函数
  6. php资源文件html,nginx 同一域名下分目录配置显示php,html,资源文件
  7. RouteOS 频繁自启
  8. highcharts:根据Y的数值范围,动态改变图形的填充颜色
  9. Instagram使用教程
  10. html5手机页面设计软件,5个非常优秀的免费H5页面制作工具(推荐)
  11. 网络安全工程师视频教程从入门到精通学习_网络安全入门教程
  12. 人民币大写金额转换为数字
  13. 金蝶k3wise 核算项目、辅助资料
  14. Oracle 轻量级实时监控工具 oratop
  15. iptable防火墙(一)
  16. docker 阿里云仓库地址
  17. java写的股票技术分析_基于Java语言开发的个性化股票分析技术:量能突破模型(Energe-Break)...
  18. 双网卡同时上内外网的方法
  19. Python基础之变量
  20. [笔记]c++Windows平台代码规范

热门文章

  1. C/C++[codeup 1785]字符串连接
  2. linux命令行中的大括号,linux命令行学习(19):花括号扩展(brace expansion)
  3. php文件显示代码行数,php统计文件中的代码行数
  4. leetcode 栈 二叉树的前向遍历
  5. 运算符重载的常识性问题
  6. 一个包含所有c++的头文件的头文件
  7. 大事化小、小事化了的动态规划
  8. 高数复习:极限与连续,一元函数微分学,一元函数积分学,多元函数微分学以及微分方程(思维导图版知识点总结)
  9. 最新基于高德地图的android进阶开发(3)GPS地图定位
  10. pdf 目录导入 macos