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();
正文完
 0
admin
版权声明:本站原创文章,由 admin 2016-02-08发表,共计2068字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.mlzj.net。