1

需求

新开发一个接口,返回结果要求使用Slice替换原来的Page

Slice和Page的区别

首先,Page是继承了Slice的,所以Page的功能要比Slice更多。

public interface Page<T> extends Slice<T> {
    int getTotalPages();

    long getTotalElements();

    <S> Page<S> map(Converter<? super T, ? extends S> var1);
}

然后从上面的方法中,我们就能看出,Page能够获取分页中的所有结果。

Slice不同,再来看一下它的源码:

public interface Slice<T> extends Iterable<T> {
    int getNumber();

    int getSize();

    int getNumberOfElements();

    List<T> getContent();

    boolean hasContent();

    Sort getSort();

    boolean isFirst();

    boolean isLast();

    boolean hasNext();

    boolean hasPrevious();

    Pageable nextPageable();

    Pageable previousPageable();

    <S> Slice<S> map(Converter<? super T, ? extends S> var1);
}

Slice只能获取到当前页的数据,然后通过上面的nextPageable()previousPageable()两个方法,又能获取到前一页和后一页的数据。所以上面的getNumber()getSize()getNumberOfElements()getContent()都是针对当前页所说的。

Why Slice

看到这里,我们就会疑惑了,既然Page的功能比Slice更加强大,那为什么我们还要使用Slice呢?

这个问题的答案,在官方文档中给出了解释:

A Page knows about the total number of elements and pages available. It does so by the infrastructure triggering a count query to calculate the overall number. As this might be expensive (depending on the store used), you can instead return a Slice. A Slice only knows about whether a next Slice is available, which might be sufficient when walking through a larger result set.

大概的意思就是说Page实现了获取所有记录的数量和页面的总数,但是它是通过count query来计算的,所以这个代价就是很大的。

所以,当我们有一个很大的数据集的时候,Slice可能就能满足我们的需求了。因为大多数时候,我们并不需要知道结果集总数是多少。


官方文档:https://docs.spring.io/spring...


喵先生的进阶之路
348 声望21 粉丝