流操作组成一个流管道。
流管道包含一个源,这个源可能是一个数组array,一个集合Collection,一个生成器函数,io管道等;0个或者更多的中间操作,这些操作将流转换为另一种流,比如filter(Predicate);
大部分的流操作接收一些参数用来描述用户指定的行为,参数一般是函数接口对象或是lambda表达式,或是方法引用。
流是懒加载的,仅仅是调用这些方法,并没有真正的开始流的遍历。
一个流只能操作一次,遍历过一次后就用完了.
流有关闭方法,但一般不需要手动关闭。只有员数据是IO流时,需要关闭;
Stream 不是集合,不保存数据,设计需要的相关计算过程,像一个高级Iterator。
流的主要用途是简化代码
以前需要多行代码的内容采用流操作只需一行就可实现。
Integer[] nums={1,3,5,4,8,5,3,1};
打印出数组中的所有偶数
for (Integer num : nums) {
if(num%2==0){
System.out.println(num);
}
}
采用stream处理
Arrays.stream(nums).filter(num->num%2==0).forEach(n->System.out.println(n));
一,Stream来源:集合,数组,文件
Arrays.stream(),
Collection.stream(),
Stream.of()
bufferedReader.lines()
二,中间操作
- 过滤
filter(),distinct,limit,skip
Filter()接收一个pridicate,判断是否满足刷选条件,
Distinct,类似于sql中的distinct关键字,用户去重,及时Object.equals(o)实现,
List<Integer>numList=Arrays.stream(nums).filter(num->num%2==0).distinct().collect(Collectors.toList());
limit操作也类似于sql的limit,返回前n个元素的流
numList=Arrays.stream(nums).limit(2).collect(Collectors.toList());
sorted:用于排序,元素需要实现Comparable或是传递比较器
numList=Arrays.stream(nums).sorted(
(o1, o2) -> o1>o2?0:1).collect(Collectors.toList());
skip 与limit相反,跳过前面的n个元素
numList=Arrays.stream(nums).skip(2).collect(Collectors.toList());
2,映射
Map,需要找出什么属性,比如需要找出一小所有人员的年龄
先用filter过滤出来在将人员映射为年龄的字符串
List<Integer> ages=userList.stream().filter(user->user.getSchool().equals("一小")).map(u->u.getAge()).collect(Collectors.toList());
找出最小的年龄
int minAge=userList.stream().filter(user->user.getSchool().equals("一小")).mapToInt(u->u.getAge()).min().getAsInt();
flatMap:将一个流中的每个值都转成一个个的流,然后将这些流扁平化为一个流
三,终端操作
查找: allMatch 所有元素都满足返回true否则返回false
boolean result=userList.stream().allMatch(user -> user.getGender().equals("3"));
anyMatch 有一个或多个元素满足就返回true
noneMatch 没有元素满足就返回true
findFirst ,返回满足条件的第一个元素
userList.stream().filter(user->user.getSchool().equals("一小")).findFirst();
findAny:返回满足条件的任意一个,当为顺序流时,与findFirst结果一样
规约: reduce(减少): 在不需要进行封装返回时,进一步的运算;
计算一小中学生的总年龄
int sum1=userList.stream().filter(user->user.getSchool().equals("一小")).mapToInt(u->u.getAge()).sum();
sum1=userList.stream().filter(user->user.getSchool().
equals("一小")).map(User::getAge).reduce(0,Integer::sum);
收集:
collect() 封装:,通过收集器java.util.stream.Collectors中的toList,toSet,toMap,
归约:使用收集器进行规约
如人员的总人数
userList.stream().count();
userList.stream().collect(Collectors.counting());
年龄总和
userList.stream().collect(Collectors.summingInt(User::getAge));
字符串拼接
String names=userList.stream().map(User::getSchool).collect(Collectors.joining(","));
分组 groupingBy()
Map<String,List<User>>map1=userList.stream().collect(Collectors.groupingBy(user -> user.getGender()));
分区 partitioningBy()按条件分区,可以一次性的找出两种情况的数据
Map<Boolean,List<User>> map=userList.stream().collect(Collectors.partitioningBy(user -> user.getGender().equals("男")));