需求
新開發一個接口,返回結果要求使用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
可能就能滿足我們的需求了。因爲大多數時候,我們並不需要知道結果集總數是多少。