需求
新开发一个接口,返回结果要求使用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
可能就能满足我们的需求了。因为大多数时候,我们并不需要知道结果集总数是多少。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。