Java Stream操作--集合使用Lambda排序

Stream 集合排序

功能说明:以自然序或着自定义Comparator 接口排序规则来排序一个流。

功能详细说明:

  1. sorted() 默认使用自然序排序, 其中的元素必须实现Comparable 接口
  2. sorted(Comparator comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。

官网代码示例:

#自然序排序一个list
list.stream().sorted() 
#自然序逆序元素,使用Comparator 提供的 reverseOrder() 方法
list.stream().sorted(Comparator.reverseOrder()) 
#使用Comparator 来排序一个list
list.stream().sorted(Comparator.comparing(Student::getAge)) 
#颠倒使用Comparator 来排序一个list的顺序,使用 Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.comparing(Student::getAge).reversed()) 

实战:按照文件编号进行排序,并计算相关文件的最小页次和最大页次

public void pageCalculation(String archSid) {
    // TODO Auto-generated method stub
    Map<String, Object> paramter = new HashMap<String, Object>();
    paramter.put("archSid", archSid);
    List<UcasFileInfo> updates = new ArrayList<UcasFileInfo>();
    List<UcasFileInfo> ucasFileInfos = ucasFileInfoMapper.selectAll(paramter);
    // 数据过滤
    if (CollectionUtils.isNotEmpty(ucasFileInfos)) {
        // Java8 排序 + 过滤
        List<UcasFileInfo> filter = ucasFileInfos.stream().filter(item -> {
            return item.getTextNums() != null && StringUtils.isNoneEmpty(item.getArchFileNo());
        }).sorted(new Comparator<UcasFileInfo>() {
            @Override
            public int compare(UcasFileInfo o1, UcasFileInfo o2) {
                if (Integer.valueOf(o1.getArchFileNo()) > Integer.valueOf(o2.getArchFileNo())) {
                    return 1;
                } else if (Integer.valueOf(o1.getArchFileNo()) == Integer.valueOf(o2.getArchFileNo())) {
                    return 0;
                } else {
                    return -1;
                }
            }
        }).collect(Collectors.toList());

        if (CollectionUtils.isNotEmpty(filter)) {
            // 页次最大与最小值计算
            Integer total = 0;
            String page_size = null;
            String max_page_size = null;
            for (int i = 0; i < filter.size(); i++) {
                UcasFileInfo ucasFileInfo = filter.get(i);

                UcasFileInfo update = new UcasFileInfo();
                update.setSid(ucasFileInfo.getSid());

                if (i == 0) {
                    page_size = "1";
                    total += ucasFileInfo.getTextNums();
                    max_page_size = page_size.concat("-") + (total);
                } else {
                    page_size = String.valueOf(total + 1);
                    total += ucasFileInfo.getTextNums();
                    max_page_size = page_size.concat("-") + (total);
                }
                // 逻辑判断:页次最大值与最小值选择
                Integer index = i + 1;
                if (index >= filter.size()) {
                    update.setPageNo(max_page_size);
                } else {
                    update.setPageNo(page_size);
                }
                updates.add(update);
            }
            // 执行批量更新
            ucasFileInfoMapper.batchUpdate(updates);
        }
    }
}

Stream.sorted 多字段排序

通过Comparator.thenComparing(Comparator other) 实现

功能说明:

1.先以年龄升序
2.当年龄相同时,在以零花钱升序

示例功能代码:

List<userInfo> userList3 = userList.stream()
.sorted(Comparator.comparing(userInfo::getAge).thenComparing(userInfo::getMoney))
.collect(Collectors.toList());

Stream.sorted 多字段排序区分降序和升序

通过Comparator.thenComparing(Comparator other) 实现多字段排序,并且使用Comparator.reverseOrder() 实现降序和升序

功能说明:

1.先以年龄升序

2.当年龄相同时,在以零花钱降序 Comparator.reverseOrder()

示例功能代码:

List<userInfo> userList3 = userList.stream()
    .sorted(Comparator.comparing(userInfo::getAge)
      .thenComparing(userInfo::getMoney,Comparator.reverseOrder()))
     .collect(Collectors.toList());

你可能感兴趣的:(JAVA学习,java,排序,stream,lambda)