流(Stream)是 Java 8 的新成员,允许你以声明式处理数据集合,可以看成为一个遍历数据集的高级迭代器。流主要有三部分构成:获取一个数据源→数据转换→执行操作获取想要的结果。每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象,这就允许对其操作可以像链条一样排列,形成了一个管道。流(Stream)提供的功能非常有用,主要包括匹配、过滤、汇总、转化、分组、分组汇总等功能。
8.1. 匹配集合数据
普通:
boolean isFound = false;for (UserDO user : userList) {
if (Objects.equals(user.getId(), userId)) {
isFound = true;
break;
}
}
精简:
boolean isFound = userList.stream()
.anyMatch(user -> Objects.equals(user.getId(), userId));
8.2. 过滤集合数据
普通:
List<UserDO> resultList = new ArrayList<>();
for (UserDO user : userList) {
if (Boolean.TRUE.equals(user.getIsSuper())) {
resultList.add(user);
}
}
精简 :
List<UserDO> resultList = userList.stream()
.filter(user -> Boolean.TRUE.equals(user.getIsSuper()))
.collect(Collectors.toList());
8.3. 汇总集合数据
普通:
double total = 0.0D;for (Account account : accountList) {
total += account.getBalance();
}
精简:
double total = accountList.stream().mapToDouble(Account::getBalance).sum();
8.4. 转化集合数据
普通:
List<UserVO> userVOList = new ArrayList<>();for (UserDO userDO : userDOList) {
userVOList.add(transUser(userDO));
}
精简 :
List<UserVO> userVOList = userDOList.stream()
.map(this::transUser).collect(Collectors.toList());
8.5. 分组集合数据
普通:
Map<Long, List<UserDO>> roleUserMap = new HashMap<>();for (UserDO userDO : userDOList) {
roleUserMap.computeIfAbsent(userDO.getRoleId(), key -> new ArrayList<>())
.add(userDO);
}
精简:
Map<Long, List<UserDO>> roleUserMap = userDOList.stream()
.collect(Collectors.groupingBy(UserDO::getRoleId));
8.6. 分组汇总集合
普通:
Map<Long, Double> roleTotalMap = new HashMap<>();
for (Account account : accountList) {
Long roleId = account.getRoleId();
Double total = Optional.ofNullable(roleTotalMap.get(roleId)).orElse(0.0D);
roleTotalMap.put(roleId, total + account.getBalance());
}
精简:
roleTotalMap = accountList.stream().collect(Collectors.groupingBy(Account::getRoleId, Collectors.summingDouble(Account::getBalance)));
8.7. 生成范围集合
Python 的 range 非常方便,Stream 也提供了类似的方法。
普通:
int[] array1 = new int[N];
for (int i = 0; i < N; i++) {
array1[i] = i + 1;
}
int[] array2 = new int[N];array2[0] = 1;
for (int i = 1; i < N; i++) {
array2[i] = array2[i - 1] * 2;
}
精简:
int[] array1 = IntStream.rangeClosed(1, N).toArray();
int[] array2 = IntStream.iterate(1, n -> n * 2).limit(N).toArray();
正文完