stream流的一些概念和理解:
stream流是Java8新出的概念,说白了,其实就是对集合的一种更高级的拓展,
在很多业务逻辑场景中, 我们需要对集合进行很多的操作,例如遍历,筛选,比较,排序等,这些需要我们写很多的代码, 有些时候我们还需要连接数据库,通过sql 对数据进行处理和筛选。 stream流就会好很多,它以声明式的操作集合,现在我们只需要告诉流需要对集合进行什么操作,那么它就会自动在内部进行操作,不会显示的表现出来,而且也无需我们手动写代码了。用的好的话,stream流也能让我们少写很多sql语句。
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"
);
一、筛选和切片(对流的数据进行过滤和选择自己想要的数据)
- 用谓词筛选 ==filter(T -> T.getXX())==
- 判断相同 去重 ==distinct()==
- 截断流 截取 ==limit(n)==
- 跳过元素 ==skip(n)==
- 排序 ==sorted(Comparator.comparing(T::getXX))==
- 遍历 ==forEach(XXX)==
二、映射
-
对流中每一个元素应用函数
==map()==
==> 一般用于提取流中的内容 map(T :: getXX)
-
流的扁平化
==flatMap()== 多个流合并成一个流
==> 将一个流中每个值都转换成另外一个流,然后再将转换的所有的流链接成一个流
三、查找与匹配
- 查找至少一个匹配 ==anyMatch()==
-
查找是全匹配
==allMatch()==
对应的无匹配是
==noneMatch()==
- 查找任意元素 ==findAny()==
- 查找第一个元素 ==findFirst()==
-
查找最小/最大的
四、归约(就是将流中的所有元素经过指定运算,折叠成一个元素输出)
- 求和 ==reduce(初始值,Integer :: sum)==
- 求最大最小 ==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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。