概述
Stream流是java8的新特性,结合lambada表达式结合使用可以提升的开发的效率和性能。
作用
1、用于对集合迭代的增强处理
2、可以对集合数组进行更高效的聚合操作,比如分组、过滤等
3、解决了传统开发过程中,jdk对集合操作的不足
模拟数据
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
}
//=================================================
ArrayList list = new ArrayList<>();
list.add(new User(1, "小王", 20));
list.add(new User(4, "小龙", 21));
list.add(new User(3, "小汤", 29));
list.add(new User(2, "小吴", 18));
排序(根据id)
ListuserList = list.stream().sorted(new Comparator () { @Override public int compare(User o1, User o2) { return o1.getId() - o2.getId(); } }).collect(Collectors.toList()); userList.forEach(System.out::println);
结果
User(id=1, name=小王, age=20) User(id=2, name=小吴, age=18) User(id=3, name=小汤, age=19) User(id=4, name=小龙, age=21) Process finished with exit code 0过滤(找到满足的条件)
//单条件过滤 ListuserList = list.stream().filter(res -> res.getId().equals(1)).collect(Collectors.toList()); userList.forEach(System.out::println); //多条件过滤 List userList = list.stream().filter(res -> { return res.getName().equals("小王") && res.getAge().equals(20); }).collect(Collectors.toList()); userList.forEach(System.out::println);
结果
User(id=1, name=小王, age=20)map(改变集合元素中的信息)
//直接返回修改的属性 ListuserList = list.stream().map(res -> res.getName().concat("_qiandu")).collect(Collectors.toList()); userList.forEach(System.out::println); //====================================================== 小王_qiandu 小龙_qiandu 小汤_qiandu 小吴_qiandu
另一种
ListuserList = list.stream().map(res -> { res.setName(res.getName() + "_qiandu"); return res; }).collect(Collectors.toList()); userList.forEach(System.out::println);
结果
User(id=1, name=小王_qiandu, age=20) User(id=4, name=小龙_qiandu, age=21) User(id=3, name=小汤_qiandu, age=19) User(id=2, name=小吴_qiandu, age=18)
这种在javascript中常用
var arr=[
{id:1,name:"qqqq"},
{id:2,name:"qqqq"},
{id:3,name:"qqqq"}
];
var new_arr = arr.map(datd=>{
data.age = 1;
return data;
})
// new_arr
{id:1,name:"qqqq",age:1},
{id:2,name:"qqqq",age:1},
{id:3,name:"qqqq",age:1}
获取总数、遍历、去重
// 获取总数
long count = list.stream().count();
int size = list.size();
//遍历,与js用法相同
list.stream().forEach(res -> {
System.out.println(res);
});
userList.forEach(System.out::println);
//去重元素,如果集合为对象 需要hashcode相同 equals为true才能成功
list.stream().distinct().collect(Collectors.toList());
求某一属性最大(小)与map(总和)
//求最大 OptionaloptionalUser = list.stream().max(new Comparator () { @Override public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); } }); //判断是否存在值 if (optionalUser.isPresent()) { System.out.println(optionalUser.get()); } //===================================================== //求集合某一属性总和 Integer totalAge = list.stream().map(res -> { return res.getAge(); //这里返回值,总的返回就是啥 }).reduce(0, (c1, c2) -> c1 + c2); System.out.println(totalAge);
在这些之中,map是比较难以使用的,他能改变返回值的形态,这些方法可以通过链式编程层层返回。
举个栗子 :用户登录的返回值会返回密码这些敏感数据,我们可以使用map对其处理。
ListuserList = list.stream().map(user -> { user.setPassWord(""); return user; //这里返回的是啥,管道流返回的就是啥 }).collect(Collectors.toList()); userList.forEach(System.out::println);
结果
User(id=1, name=小王, passWord=) User(id=4, name=小龙, passWord=) User(id=3, name=小汤, passWord=) User(id=2, name=小吴, passWord=)



