zoukankan      html  css  js  c++  java
  • JDK8 Stream简单应用实现分页

    1,功能目的
      平常做一些CRUD业务可能会涉及到查询分页列表的问题,但是有一些业务数据可能不只存在于数据库表之中,可能在ES,mongo,redis等各种数据聚合而成,返回也需要做到有分页效果,因此我们可以利用JDK8的新特性来实现一种简单的分页。

    2,功能API-Stream

    2.1 筛选与切片
      filter:过滤流中的某些元素
      limit(n):获取n个元素
      skip(n):跳过n元素,配合limit(n)可实现分页
      distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素

    Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);
    Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14
    .distinct() //6 7 9 8 10 12 14
    .skip(2) //9 8 10 12 14
    .limit(2); //9 8
    newStream.forEach(System.out::println);
     
    2.2 映射
      map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
      flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

    List<String> list = Arrays.asList("a,b,c", "1,2,3");

    //将每个元素转成一个新的且不带逗号的元素
    Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", ""));
    s1.forEach(System.out::println); // abc 123

    Stream<String> s3 = list.stream().flatMap(s -> {
    //将每个元素转换成一个stream
    String[] split = s.split(",");
    Stream<String> s2 = Arrays.stream(split);
    return s2;
    });
    s3.forEach(System.out::println); // a b c 1 2 3 
    2.3 排序
      sorted():自然排序,流中元素需实现Comparable接口
      sorted(Comparator com):定制排序,自定义Comparator排序器

    List<String> list = Arrays.asList("aa", "ff", "dd");
    //String 类自身已实现Compareable接口
    list.stream().sorted().forEach(System.out::println);// aa dd ff

    Student s1 = new Student("aa", 10);
    Student s2 = new Student("bb", 20);
    Student s3 = new Student("aa", 30);
    Student s4 = new Student("dd", 40);
    List<Student> studentList = Arrays.asList(s1, s2, s3, s4);

    //自定义排序:先按姓名升序,姓名相同则按年龄升序
    studentList.stream().sorted(
    (o1, o2) -> {
    if (o1.getName().equals(o2.getName())) {
    return o1.getAge() - o2.getAge();
    } else {
    return o1.getName().compareTo(o2.getName());
    }
    }
    ).forEach(System.out::println);  
    Student s1 = new Student("aa", 10);
    Student s2 = new Student("bb", 20);
    List<Student> studentList = Arrays.asList(s1, s2);

    studentList.stream()
    .peek(o -> o.setAge(100))
    .forEach(System.out::println);

    //结果:
    Student{name='aa', age=100}
    Student{name='bb', age=100} 
    3,代码实现

    3.1 Page类

    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;

    import java.util.List;
    import java.util.Map;


    /**
    * @author :Eidos
    * @date :Created in 2020/12/9
    * @description:分页基础类
    * @modified By:
    * @version: 1.0
    */
    @ApiModel
    @NoArgsConstructor
    @AllArgsConstructor
    public class Page<T> {
    @ApiModelProperty(value = "页码")
    @Getter
    @Setter
    private int currentPage;
    @ApiModelProperty(value = "分页大小")
    @Getter
    @Setter
    private Integer pageSize;
    @ApiModelProperty(value = "总数")
    private Integer total;
    @ApiModelProperty(value = "页数")
    @Getter
    @Setter
    private Integer pages;
    @ApiModelProperty(value = "数据集")
    @Getter
    @Setter
    private List<Map<String, Object>> records;

    public Page(Integer pageNo, Integer pageSize) {
    this.pageSize = pageSize;
    this.currentPage = pageNo;
    }

    public Integer getTotal() {
    return total;
    }

    public void setTotal(Integer total) {
    this.total = total;
    this.pages = (total + pageSize - 1) / pageSize;
    }

    3.2 分页方法

    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import lombok.extern.slf4j.Slf4j;

    import java.util.List;
    import java.util.stream.Collectors;

    /**
    * @author : Eidos
    * @date :Created in 2020/12/28
    * @description:
    * @modified By:
    * @version: 1.0
    */

    @Slf4j
    public class PageUtil {

    /**
    * 分页方法
    *
    * @param list 要分页的数据
    * @param page 分页
    */
    public static <T> List<T> getPageResult(List<T> list, Page page) {
    page.setTotal(list.size());
    //模拟分页效果
    return list.stream().skip((page.getCurrent() - 1) * page.getSize())
    .limit(page.getSize())
    .collect(Collectors.toList());

    }



    核心思想:与平常分页想法一致。用skip跳过前面的数据,用limit来限制中间的数据,就能得到完整的分页结果。 可以将聚合好的数据存在服务器或者redis中, 这样便于下次继续使用分页。


    ————————————————
    版权声明:本文为CSDN博主「EidosMephiste」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_40156790/article/details/113754086

  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/javalinux/p/14809327.html
Copyright © 2011-2022 走看看