当前位置: 首页 > news >正文

Java的 Stream流

  • Stream流?

结合Lambda表达式,用于简化集合和数组操作的API。

  • Stream流的一个小例子:

  • 创建一个集合,存储多个姓名,把集合中所有以"张"开头的长度为3的元素存储到一个新的集合并输出。

        List<String> names=new ArrayList<>();Collections.addAll(names,"张若虚","张仲景","李白","王维","张三");System.out.println(names);
//非Stream流//find zhangList<String> zhang=new ArrayList<>();for (String name : names) {if(name.startsWith("张"))zhang.add(name);}System.out.println(zhang);//find length is 3List<String> three=new ArrayList<>();for (String name : names) {if(name.length()==3)three.add(name);}System.out.println(three);
//Stream流//stream way           lambda表达式names.stream().filter(s -> s.startsWith("张")).filter(s->s.length()==3).forEach(s -> System.out.println(s));

可以看到通过Stream流方法代码简化到一行了。对于这一行Stream流方法代码可以分为三类方法:获取Stream流方法、中间方法、终结方法。

  1. 获取Stream流方法

  • 集合得到Stream流:使用Stream()方法,例如示例的 names.stream()

  • 数组得到Stream流:a,使用Stream()方法;b,使用Stream.of()

        //1Collection<String> list=new ArrayList<>();Stream<String> Streamlist=list.stream();//2Map<String,Integer> maps=new HashMap<>();Stream<String> StreamKey=maps.keySet().stream();//键的流Stream<Integer> StreamVal=maps.values().stream();//值的流Stream<Map.Entry<String,Integer>> StreamMaps=maps.entrySet().stream();//键值对的流//3Integer[] a={1,2,3,4,5};Stream<Integer> ast= Arrays.stream(a);//aStream<Integer> ast2=Stream.of(a);//b
  1. 中间方法

中间方法也称为非终结方法,调用完成后返回新的Stream流,支持链式编程。

常用中间方法API:

filter:对流中的数据进行过滤。

limit:获取前几个元素。

skip:跳过前几个元素。

distinct:去除流中重复的元素(hashCode和equals)。

concat:合并两个流。

Stream流中无法直接修改集合、数组中的数据。

  1. 终结方法

终结方法后流不可以继续使用

//执行示例的非终结流输出
System.out.println(names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3));
System.out.println(names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).count());
//控制台:
java.util.stream.ReferencePipeline$2@3d075dc0
2

就是说没有添加终结方法会返回一个流stream,添加添加终结方法会返回具体内容。

常见终结操作:

forEach:流的每个元素执行遍历操作。

count:返回流中的元素数。

end.收集Stream流

把Stream流操作后的结果数据转回到集合或者数组中去,因为Stream流中无法直接修改集合、数组中的数据。

Stream流是方便操作集合、数组的手段,集合、数组才是目的。

一般方法:collect (可变集合)

具体方法:toList、toSet、toMap、toArray;

//继续示例的流:Stream<String> str=names.stream().filter(s -> s.startsWith("张")).filter(s->s.length()==3);List<String> z3List=str.collect(Collectors.toList());//collectList<String> z3List2=str.toList();//toListObject[] arrs=str.toArray();//toArray

其中toArray可以指定返回的对象类型,就可不使用Object来接收了。

        String[] arrs=str.toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[0];}});

!流只能使用一次,收集完就没了

stream has already been operated upon or closed

http://www.lryc.cn/news/24474.html

相关文章:

  • FL Studio 21 中文正式版发布支持多种超个性化主题
  • 【微信小程序】-- 全局配置 -- window - 导航栏(十五)
  • Spring中最常用的11个扩展点
  • 网络协议丨HTTPS是什么?
  • Anaconda常用命令总结,anaconda、conda、miniconda的关系
  • 【蓝桥杯入门到入土】最基础的数组你真的掌握了吗?
  • Java Set系列集合(Collections集合工具类、可变参数)
  • chromium构建原生AS项目-记录1
  • Mybatis-Plus 开发提速器:mybatis-plus-generator-ui
  • 李迟2023年02月工作生活总结
  • 【Python百日进阶-Web开发-Vue3】Day542 - Vue3 商城后台 02:Windi CSS 与 Vue Router4
  • Jupyter Lab | “丢下R,一起来快乐地糟蹋服务器!”
  • 分页与分段
  • 【UE4 】制作螺旋桨飞机
  • 五.家庭:亲情背后有理性
  • 【Leedcode】栈和队列必备的面试题(第三期)
  • 《图机器学习》-GNN Augmentation and Training
  • 【Node.js算法题】数组去重、数组删除元素、数组排序、字符串排序、字符串反向、字符串改大写 、数组改大写、字符替换
  • Win10系统开始菜单无法点击解决方法分享
  • libmodbus从linux访问window上的服务超时问题
  • 挑战图像处理100问(26)——双线性插值
  • NXP iMX8系列处理器Pin Multiplexing定义说明
  • 用Python的Supervisor進行進程監控以及自動啓動
  • Centos和Window系统下Frp内网穿透
  • 春招冲刺(四):flex布局面试题总结
  • 我的 System Verilog 学习记录(7)
  • canvas复习笔记(绘制直线、矩形、圆形、圆弧)
  • LeetCode 653. 两数之和 IV - 输入二叉搜索树
  • 【Datawhale图机器学习】图神经网络
  • 【项目精选】 javaEE采购管理系统(论文+视频+源码)