Stream流

什么是流

从支持数据处理操作的源生成的元素序列

流与集合的区别

  • 时间和空间

    从流和集合的定位来看,集合面向的是存储,而流面向的是计算,比如说要构建一个质数集合,那理论上来说是构建不出来的,因为质数是无穷大的,不可穷举,而构建一个质数流是可行的,因为只要在使用的时候实时计算出这个质数就可以了,从这个角度来说,本质上说还是时间和空间的区别

  • 只能遍历一次

    集合可以遍历多次,而流是一个空间上的概念,再次遍历会出现异常

    java 复制代码
      List<String> names=Arrays.asList("Tom","Jim","Joe");
      names.forEach(System.out::println);
      names.forEach(System.out::println);
      Stream<Integer> s = Stream.of(1, 2, 3, 4, 5);
      s.forEach(System.out::println);
      s.forEach(System.out::println);//报异常
      ######sout#############
      Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed 
  • 外部迭代和内部迭代

    java 复制代码
     //集合处理方式
      List<String> names1=new ArrayList<>();
      for (Dish d:menu) {
          names1.add(d.getName());
      }
      //流处理方式
      List<String> names2=menu.stream().map(Dish::getName).collect(toList());

    两者的处理方式很直观。集合使用 foreach 外部迭代,而流是内部迭代的方式。也就是流帮你处理了。

流的组成

流操作分类

如何理解?比如有状态操作,dictinct 去重,一定是等到所有数据就位后,在所有数据的基础上进行去重,而像 filter 只要对单个的数据(对象)进行操作就好了,并不需要等所有数据;短路操作,比如 findFirst,只要找到第一个元素直接返回结果,不管后面还有多少元素,而像 foreach 循环,每个数据都要执行一次,非短路对吧。

流的使用

flatMap 使用:将多维嵌套列表转换为单维列表,或者将多个列表合成一个列表

java 复制代码
List<String> first= Arrays.asList("one", "two", "three", "four");
List<String> second= Arrays.asList("A", "B", "C", "D");
Stream.of(first,second).flatMap(Collection::stream).forEach(System.out::print);
java 复制代码
List<String> list1 = Arrays.asList("aa", "bb", "cc");
List<String> list2 = Arrays.asList("11", "22", "33");
List<List<String>> list = Arrays.asList(list1,list2);
List<String> collect = list.stream().flatMap(item -> item.stream()).collect(Collectors.toList());
System.out.println(collect);

Stream 流的构建

java 复制代码
//由数值直接构建流
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.forEach(System.out::println);
//数组构建流
IntStream stream = Arrays.stream(new int[]{1, 2, 3, 4, 5});
stream.forEach(System.out::println);
//通过文件构建流
Stream<String> lines = Files.lines(Paths.get("D:\\NewIOClient.java"));
lines.forEach(System.out::println);
//函数生成流,如果不加限制,会无限生成
Stream<Integer> iterate = Stream.iterate(0, n -> n + 2).limit(3);
iterate.forEach(System.out::println);
Stream<Double> generate = Stream.generate(Math::random);
generate.limit(10).forEach(System.out::println);

预定义收集器

collect(Collectors.toList)、collect(Collectors.toSet)、collect(Collectors.toMap) 这些不说了,更多的功能请看 Collectors 类

java 复制代码
// Map<分组条件,结果集合>
Map<Object, List<User>> map = list.stream.collect(Collectors.groupingBy(user->user.getSex()));
// 分区
Map<Boolean, List<User>> map = list.stream.collect(Collectors.partitionBy(user->user.getAge()>100));

Lamda表达式

【有道云笔记】01. Lamabda 表达式 Stream.md

相关推荐
fox_lht43 分钟前
15.3.改进我们之前的输入、输出项目
开发语言·后端·学习·rust
JohnnyDeng941 小时前
【Android】Android 包体积优化:R8/ProGuard 深度配置全攻略
android·性能优化·kotlin·jetpack
故渊at1 小时前
第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线
android·camera·多媒体体系·hal3
java1234_小锋1 小时前
LangChain4j 开发Java Agent智能体- 多模态支持
java·开发语言·langchain4j
凡人叶枫1 小时前
Effective C++ 条款23:宁以 non-member、non-friend 替换 member 函数
linux·开发语言·c++·嵌入式开发
艳阳天_.1 小时前
星瀚弹框页面实现
java·前端·python
张忠琳1 小时前
【Go 1.26.4】Golang Channel 深度解析
开发语言·后端·golang
盈建云系统1 小时前
B2B产品展示网站怎么做?从产品目录到询盘表单,企业获客页面搭建流程
开发语言·网站搭建·开发网站
不会C语言的男孩1 小时前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言
kernelcraft1 小时前
Boto3:Python 操作 AWS 的官方 SDK
开发语言·python·其他·aws