Java8API中增加了名为流Stream的新抽象,允许您对数据进行基于语句的处理它允许程序员把复杂而又庞大的问题简单化,并能使程序更容易理解。这个被命名为流”的组件是目前最流行的编程语言之一Stream是一种用SQL语句来表示数据库的方法,它提供了一种与Java集合运算类似的高阶抽象该样式所要处理的元素集合被认为是一个流动,该流动在管中被传递并可在管的结点处被处理,如筛选、排序和聚合
Linux提供给用户的接口有很多,其中最重要的就是Linux下的|管道符功能在Linux中,po可以用来表示进程间通信时使用的端口名称,而vO则代表了进程之间相互通讯时所采用的通信协议。下面我们就来学习一下这两种协议的具体应用吧!以上这段文字引自runoob.c_m,但它的教学代码是以String列表为基础来展示的,鉴于现实中百分之80是针对PO,VO,所以下面以一个PO来说明
对于相对于for循环运行的list来说,最严重的缺点是代码过长、太混乱,若是牵涉到3-4个表格运行,即牵涉到几个PO运行,那括号里根本就不是俄罗斯套娃的意思,写完后还真不是自己能写出啥
+--------------------++------++------++---++-------+|streamofelements+----->;|filter+->;|sorted+->;|map+->;|collect|+--------------------++------++------++---++-------+
publicclassUserPo{privateStringname;privateDoublescore
下面的运算都用UserPo来说明
filter:过滤,是一种过滤器,满足条件就过关,不满足条件就被滤除
//筛选出成绩不为空的学生人数count=list.stream().filter(p->;null!=p.getScore()).count()
map:映射他把原来的集合映射到一个新集合上,这是VO和PO处理过程中经常用到的本文针对一个具体问题给出了一种新方法——基于向量空间模型的Map-value映射算法,并通过实例说明该算法能够较好地完成此问题。最后指出其不足之处及改进方向原集合与PO集合之间的转换是通过对新集合进行自定义映射来实现的,即把学生的成绩集合映射到新集合中去
//取出所有学生的成绩List scoreList=list.stream().map(p->;p.getScore()).collect(Collectors.toList());//将学生姓名集合串成字符串,用逗号分隔StringnameString=list.stream().map(p->;p.getName()).collect(Collectors.joining(","))
//按学生成绩逆序排序正序则不需要加.reversed()filterList=list.stream().filter(p->;null!=p.getScore()).sorted(Comparator.c_mparing(UserPo::getScore).reversed()).collect(Collectors.toList())
forEach:这个应使用频率最高,即对每个元素都有自定义操作
除forEach运算对原集合中数据进行了修改外,其余运算都没有对原集合进行修改,这一点必须加以重视
collect:聚合,可应用于GroudBy根据指定的字段进行分类,或返回列表或拼凑字符串
//按成绩进行归集Map<;double,list<;userpo=>;>;groupByScoreMap=list.stream().filter(p->;null!=p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));for(Map.Entry<;double,list<;userpo=>;>;entry:groupByScoreMap.entrySet()){System.out.println("成绩:"+entry.getKey()+"人数:"+entry.getValue().size());}//返回listList scoreList=list.stream().map(p->;p.getScore()).collect(Collectors.toList());//返回string用逗号分隔StringnameString=list.stream().map(p->;p.getName()).collect(Collectors.joining(","));<;/double,>;<;/double,>
statistics:统计学,可统计中位数、平均值、最大最小值
DoubleSummaryStatisticsstatistics=filterList.stream().mapToDouble(p->;p.getScore()).summaryStatistics();System.out.println("列表中最大的数:"+statistics.getMax());System.out.println("列表中最小的数:"+statistics.getMin());System.out.println("所有数之和:"+statistics.getSum());System.out.println("平均数:"+statistics.getAverage())
parallelStream:并行流,可使用多线程来执行流以提高效率由于并行计算的特点是在一个系统内同时执行多个任务,所以我们将其称为并行流。它与传统串行算法相比具有以下优点:1.减少了时间消耗。2.提高了计算速度线程传播性越好,则并行流操作所需时间越长
//并行流count=list.parallelStream().filter(p->;null!=p.getScore()).count()
packagecom.cmx.tcn.stream;publicclassUserPo{privateStringname;privateDoublescore;publicUserPo(Stringname,Doublescore){this.name=name;this.score=score;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicDoublegetScore(){returnscore;}publicvoidsetScore(Doublescore){this.score=score;}publicStringtoString(){return"UserPo{"+"name=+name+"+",score="+score+"}";}}
packagecom.cmx.tcn.stream;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.DoubleSummaryStatistics;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;/***@author:CaiMinXing*@create:2022-03-2518:15**/publicclassStreamTest{//+--------------------++------++------++---++-------+//|streamofelements+----->;|filter+->;|sorted+->;|map+->;|collect|//+--------------------++------++------++---++-------+publicstaticvoidmain(Stringargs[]){List list=newArrayList<;>;();list.add(newUserPo("小一",10.d));list.add(newUserPo("小五",50.d));list.add(newUserPo("小六",60.d));list.add(newUserPo("小6",60.d));list.add(newUserPo("小空",null));list.add(newUserPo("小九",90.d));longcount=0;List filterList=null;//filter过滤器的使用//筛选出成绩不为空的学生人数count=list.stream().filter(p->;null!=p.getScore()).count();System.out.println("参加考试的学生人数:"+count);//collect//筛选出成绩不为空的学生集合filterList=list.stream().filter(p->;null!=p.getScore()).collect(Collectors.toList());System.out.println("参加考试的学生信息:");filterList.stream().forEach(System.out::println);//map将集合映射为另外一个集合//取出所有学生的成绩List scoreList=list.stream().map(p->;p.getScore()).collect(Collectors.toList());System.out.println("所有学生的成绩集合:"+scoreList);//将学生姓名集合串成字符串,用逗号分隔StringnameString=list.stream().map(p->;p.getName()).collect(Collectors.joining(","));System.out.println("所有学生的姓名字符串:"+nameString);//sorted排序//按学生成绩逆序排序正序则不需要加.reversed()filterList=list.stream().filter(p->;null!=p.getScore()).sorted(Comparator.c_mparing(UserPo::getScore).reversed()).collect(Collectors.toList());System.out.println("所有学生的成绩集合,逆序排序:");filterList.stream().forEach(System.out::println);System.out.println("按学生成绩归集:");Map<;double,list<;userpo=>;>;groupByScoreMap=list.stream().filter(p->;null!=p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));for(Map.Entry<;double,list<;userpo=>;>;entry:groupByScoreMap.entrySet()){System.out.println("成绩:"+entry.getKey()+"人数:"+entry.getValue().size());}//forEachfilterList.stream().forEach(p->;p.setScore(p.getScore()+10));System.out.println("及格人数太少,给每个人加10分");filterList.stream().forEach(System.out::println);//countcount=filterList.stream().filter(p->;p.getScore()>;=60).count();System.out.println("最后及格人数"+count);DoubleSummaryStatisticsstatistics=filterList.stream().mapToDouble(p->;p.getScore()).summaryStatistics();System.out.println("列表中最大的数:"+statistics.getMax());System.out.println("列表中最小的数:"+statistics.getMin());System.out.println("所有数之和:"+statistics.getSum());System.out.println("平均数:"+statistics.getAverage());//并行流使用count=list.parallelStream().filter(p->;null!=p.getScore()).count();System.out.println("并行流处理参加考试的学生人数:"+count);}}<;/double,>;<;/double,>