Java8--Stream流 - Go语言中文社区

Java8--Stream流


stream流的一些概念和理解:

stream流是Java8新出的概念,说白了,其实就是对集合的一种更高级的拓展,
在很多业务逻辑场景中, 我们需要对集合进行很多的操作,例如遍历,筛选,比较,排序等,这些需要我们写很多的代码, 有些时候我们还需要连接数据库,通过sql 对数据进行处理和筛选。 stream流就会好很多,它以声明式的操作集合,现在我们只需要告诉流需要对集合进行什么操作,那么它就会自动在内部进行操作,不会显示的表现出来,而且也无需我们手动写代码了。用的好的话,stream流也能让我们少写很多sql语句。

stream流的一些特点:
1一次遍历 
我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍。
2采用内部迭代方式 
若要对集合进行处理,则需我们手写处理代码,这就叫做外部迭代。而要对流进行处理,我们只需告诉流我们需要什么结果,处理过程由流自行完成,这就称为内部迭代。

这里要注意的是,不管你做什么操作,源数据的内容是不会被改变的,改变的结果只呈现在结果集中。




stream流的一些具体方法:
如何获取流:

集合 
这种数据源较为常用,通过stream()方法即可获取流对象:
List <Person> list = new ArrayList<Person>();
Stream<Person> stream = list .stream();
数组 
通过Arrays类提供的静态函数stream()获取数组的流对象:
String [] names = { "chaimm" , "peter" , "john" };
Stream< String > stream = Arrays.stream(names);
值 
直接将几个值变成流对象:
Stream< String > stream = Stream. of ( "chaimm" , "peter" , "john" );


一、筛选和切片(对流的数据进行过滤和选择自己想要的数据)

  1. 用谓词筛选 ==filter(T -> T.getXX())==
  2. 判断相同 去重 ==distinct()==
  3. 截断流 截取 ==limit(n)==
  4. 跳过元素 ==skip(n)==
  5. 排序 ==sorted(Comparator.comparing(T::getXX))==
  6. 遍历 ==forEach(XXX)==

二、映射

  1. 对流中每一个元素应用函数 ==map()==
    ==> 一般用于提取流中的内容 map(T :: getXX)
  2. 流的扁平化 ==flatMap()==  多个流合并成一个流
    ==> 将一个流中每个值都转换成另外一个流,然后再将转换的所有的流链接成一个流

三、查找与匹配

  1. 查找至少一个匹配 ==anyMatch()==
  2. 查找是全匹配 ==allMatch()==
    对应的无匹配是 ==noneMatch()==
  3. 查找任意元素 ==findAny()==
  4. 查找第一个元素 ==findFirst()==
  5. 查找最小/最大的

四、归约(就是将流中的所有元素经过指定运算,折叠成一个元素输出)

  1. 求和 ==reduce(初始值,Integer :: sum)==
  1. 求最大最小 ==reduce(初始值,Integer :: sum)==


Stream流的实践:

按照我们习以为常的学生来举例子吧:创建实体类,这里就写了, 大家明白
然后我们获取一个包含了 所有学生姓名,年龄,成绩,的一个数组,命名为  studentListAll
现在有个班级,挑选出学生年龄在18岁以下的学生,并按照学习成绩好坏将他们排序,然后然他们站成一排领奖。

如果按照以前的思路,我们要这么实现:
 通过迭代器筛选出年龄小于18岁的学生
List<Student> studentList= new ArrayList<Student>();
for (Student stu :studentListAll) {
if (stu.getAge() < 18) {
studentList.add(s);
}
}

按照匿名类将学生的成绩从大到小排序
Collections.sort(studentList, new Comparator<Stone>() {
public int compare(Student stu1, Student stu2) {
returnInteger.compare(stu1.getGrade(), stu2.getGrade());
}
});
将排序好的学生站好队伍
List< String > finalStudentList = new ArrayList<Student>();
for ( Student stu : studentList) {
finalStudentList .add( stu .getName());
}
}

Java8(Stream)实现

那么接下来就是根据stream流来实现。

List<String> finalStudentList  = studentAllList.stream() //将源数据转化成stream流
                                                   .filter( stu ->stu.getAge()<18) // 将小于18岁的学生提取出来
                                                   .sorted(comparing(Student :: getGrade)) //对学生的成绩进行排序
                                                   .map(Student :: getName) // 取出符合要求的学生的名字
                                                   .collect(toList());   //将名字保存到List中。


下面这个博客有更详细的实例


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lyh147406/article/details/80651379
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-17 21:06:45
  • 阅读 ( 1045 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢