文章目录
一、stream简介
stream 是针对集合数组等数据源进行逻辑计算的方法。
stream只是计算,并不会修改数据源。
stream只在需要的时候才会执行。
二、stream的生命周期
三、创建stream的几种方法
1. 使用数组
String[] arrays = { "aa" , "bb" , "cc" , "dd" , "ee" , "ff" };
//方法1
Stream<String> arrays1 = Stream.of(arrays);
//方法2
Stream<String> arrays2 = Arrays.stream(arrays);
2. 使用集合
List<String> list = Arrays.asList("aa", "bb", "cc", "dd", "ee", "ff");
//List
Stream<String> arrays3 = list.stream();
HashSet<String> set = new HashSet<>(list);
//Set
Stream<String> arrays4 = set.stream();
3. 使用Stream随机生成
//生成10个随机数
Stream<Double> arrays5 = Stream.generate(new Random()::nextDouble).limit(10);
4. 使用 Stream迭代器
我们可以使用Stream.iterate创建流值,即所谓的无限流
Stream<Integer> array6 = Stream.iterate(1, integer -> integer + 2).limit(10);
array6.forEach(a-> System.out.print(a+"\t"));
result:
1 3 5 7 9 11 13 15 17 19
四、使用stream流的几种方式
// VO 类
public class UserVO {
private long id;//标识id
private String userEn; //英文名
private String userCn; //中文名
private String department; //所属部门
private String userType; //用户类型
// 省略 getter and setter
}
//测试数据
UserVO u1 = new UserVO(1,"zhangsan","张三","一部","研发");
UserVO u2 = new UserVO(2,"lisi","李四","二部","研发");
UserVO u3 = new UserVO(3,"wangwu","王五","一部","市场");
UserVO u4 = new UserVO(4,"zhangsan","章三","二部","市场");
List<UserVO> list = new ArrayList<UserVO>(){{
add(u1);add(u2);add(u3);add(u4);
}};
forEach
遍历流中的每个数据
list.stream().forEach(vo -> System.out.printf(vo.toString()));
result:
UserVO{id=1, userEn='zhangsan', userCn='张三', department='一部', userType='研发'};
UserVO{id=2, userEn='lisi', userCn='李四', department='二部', userType='研发'};
UserVO{id=3, userEn='wangwu', userCn='王五', department='一部', userType='市场'};
UserVO{id=4, userEn='zhangsan', userCn='章三', department='二部', userType='市场'};
filter
字段过滤,需要保留字段的目标表达式直接为true
Stream<UserVO> userVOStream = list.stream().filter(vo -> "市场".equals(vo.getUserType()));
userVOStream.forEach(vo -> System.out.printf(vo.toString()));
result:
UserVO{id=3, userEn='wangwu', userCn='王五', department='一部', userType='市场'};
UserVO{id=4, userEn='zhangsan', userCn='章三', department='二部', userType='市场'};
如果是复杂的多条件语句,可用{}包起来,匹配到目标值时return true
Stream<UserVO> userVOStream = list.stream().filter(vo -> {
if ("市场".equals(vo.getUserType())){
return true;
}else{
if ("一部".equals(vo.getDepartment())){
return true;
}
}
return false;
});
userVOStream.forEach(vo -> System.out.printf(vo.toString()));
result:
UserVO{id=1, userEn='zhangsan', userCn='张三', department='一部', userType='研发'};
UserVO{id=3, userEn='wangwu', userCn='王五', department='一部', userType='市场'};
UserVO{id=4, userEn='zhangsan', userCn='章三', department='二部', userType='市场'};