Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!

| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 行业新闻 >

java 代码精简之利用 Stream

发布日期:2020-05-13 14:33:25点击次数:

分享到:
java 代码精简之利用 Stream

流(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();