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

Java基础(下)之Stream

Stream流

Stream流的作用是结合Lambda表达式,简化集合、数组的操作,其使用步骤可总结为:

  1. 先得到一条Stream流(流水线),并把数据放上去;
    image
  2. 使用中间方法对流水线上数据进行操作;
    image
  3. 使用终结方法对流水线上数据进行操作;
    image

获取Stream流

package com.example.helloworld;
import java.io.*;
import java.util.*;
import java.util.stream.Stream;class Main{public static void main(String[] args) throws Exception{//单列集合ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1,"张三","张三丰","李四","王二");list1.stream().forEach(name -> System.out.println(name));//双列集合HashMap<String,Integer>mp = new HashMap<>();mp.put("aaa",111);mp.put("bbb",222);mp.put("ccc",333);mp.put("ddd",444);mp.keySet().stream().forEach(e -> System.out.println(e));mp.entrySet().stream().forEach(pair -> System.out.println(pair));//数组int[] arr1 = {11,22,3,44,555};String[] arr2 = {"123","456","999"};Arrays.stream(arr1).forEach(num -> System.out.println(num));Arrays.stream(arr2).forEach(str -> System.out.println(str));//一堆零散数据//方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组//但是数组必须是引用数据类型的,若传递基本数据类型,则会把整个数组当作一个元素,放到Stream中。Stream.of(1,2,3,4,5).forEach(num-> System.out.println(num));Stream.of("a","b","c","d","e").forEach(num-> System.out.println(num));Stream.of(arr1).forEach(num-> System.out.println(num));}
}

中间方法

package com.example.helloworld;
import java.util.*;
import java.util.stream.Stream;class Main{public static void main(String[] args) throws Exception{//单列集合ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"赵四","李龙");ArrayList<String> list3 = new ArrayList<>();Collections.addAll(list3,"张三-10","张三丰-13","张益达-14");//过滤出张开头且长度为3的名字list1.stream().filter(name -> name.startsWith("张")).filter(name->name.length() == 3).forEach(name -> System.out.printf("%s ",name));System.out.println();//只取前几个元素list1.stream().limit(3).forEach(name -> System.out.printf("%s ",name));System.out.println();//跳过前几个元素list1.stream().skip(2).forEach(name -> System.out.printf("%s ",name));System.out.println();//去重list1.stream().distinct().forEach(name-> System.out.printf("%s ",name));System.out.println();//合并两个流为一个流Stream.concat(list1.stream(),list2.stream()).forEach(name-> System.out.printf("%s ",name));System.out.println();//转换流中数据类型list3.stream().map(name -> Integer.parseInt(name.split("-")[1])).forEach(age -> System.out.printf("%d ",age));System.out.println();}
}

注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程

ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1,"张三","张三丰","张益达","李四","王二");Stream<String> stream1 = list1.stream().filter(name -> name.startsWith("张") && name.length() == 3);stream1.forEach(name-> System.out.println(name));//Stream已经执行了终结方法后关闭了,无法再次执行中间方法stream1.filter(name->name.length()==3);

注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

终结方法

注意1:执行终结方法后,无法再接着使用该Stream;

package com.example.helloworld;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;class Main{public static void main(String[] args) throws Exception{//单列集合ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");//遍历流中的每个元素list1.stream().forEach(name-> System.out.printf("%s ",name));System.out.println();//统计流中元素的个数,返回值为longlong count = list1.stream().count();System.out.println(count);//将流中的元素放入数组并返回,size为集合中的元素个数String[] arr1 = list1.stream().toArray(size->new String[size]);System.out.println(Arrays.toString(arr1));//收集流中的数据,放到集合中(List、Set、Map)ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"张三丰-男-15","李四-女-16","王二-男-22","张伦-男-20","张伦达-男-20");//收集到List集合中List<String> newlist = list2.stream().filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常.collect(Collectors.toList());//创建一个List,把流中元素放入其中并返回System.out.println(newlist);//收集到Set集合中,与List的区别在于:是否可重复、是否有序、是否可随机访问Set<String> newset = list2.stream().filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常.collect(Collectors.toSet());//创建一个Set,把流中元素放入其中并返回System.out.println(newset);//收集到Map集合中,其中姓名作为Key,年龄作为ValueMap<String, Integer> newmap = list2.stream().filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常.collect(Collectors.toMap(person -> person.split("-")[0], person -> Integer.parseInt(person.split("-")[2])));System.out.println(newmap);}

总结

image

http://www.jsqmd.com/news/409319/

相关文章:

  • Java基础(下)之方法引用
  • 题解:AcWing 886 求组合数 II
  • 题解:AcWing 885 求组合数 I
  • 功能炸裂!推荐一款低代码数据大屏可视化系统,内置丰富模版,支持拖拽构建炫酷大屏
  • 视频孪生终结者:镜像视界空间神经系统与空间控制权重构——融合统一空间坐标反演体系 × 三维实时定位引擎 × 多路径概率展开模型 × 前向围堵优化算法的跨行业空间压制与主动调度控制平台
  • 大数据领域数据产品的搜索功能优化
  • AI原生应用开发:如何利用Copilot实现代码质量与效率双提升
  • HNOI 2026 退役记
  • 从零开始:使用 Claude Code 打造字母消除游戏
  • 价值投资中的AI智能体可持续发展能力分析系统
  • AI模型部署自动化的核心:镜像+编排+监控的三位一体设计
  • 微信小程序 uniapp+vue老年人心血管健康
  • 基于径向基神经网络(RBF)预制构件需求量预测GUI软件
  • Sass/SCSS函数深度解析
  • 1亿条URL去重,怎么搞才不崩?生产级方案全解析(从入门到大厂实战)
  • 强化学习·价值学习-MC,TD和Q-learning算法
  • day95(2.24)——leetcode面试经典150
  • 强化学习·导论
  • 一些喜欢的 ACG 曲
  • 灰色关联度模型正负性问题的研究及其改进附Matlab代码
  • 小程序商城开发怎么选?5 家优质平台实测推荐,避开低价陷阱不踩雷 - 企业数字化改造和转型
  • 基于动态神经网络NARX/GRNN/BP/RBF的IBM收盘价预测-时间序列预测附Matlab代码
  • 性价比封神!微信小程序开发平台排名,零隐形消费平台优先选 - 企业数字化改造和转型
  • 基于经验模态分解和粒子群优化支持向量机(EMD+PSO_SVM)大坝变形预测附Matlab代码
  • Metasploit新手入门|从安装到首次漏洞探测
  • 高效科研工具:9大论文目录生成软件,自动更新功能详解
  • 中小商家首选|十大小程序开发公司排名,年费低至700元 - 企业数字化改造和转型
  • 学术研究必备:盘点9款智能目录生成工具,一键自动更新
  • Sass/SCSS继承深度解析
  • Metasploit常用命令速查备忘单(高频实操版)