2010-12-16 40 views
4

我不結果分頁經常(給出頁碼和頁面大小來計算起點,終點和總頁數)和我移植從Java這個小功能的幫助:更好的辦法做到結果分頁斯卡拉

def page(page: Int, pageSize: Int, totalItems: Int) = { 
    val from = ((page - 1) * pageSize) + 1 
    var to = from + pageSize - 1 
    if (to > totalItems) to = totalItems 
    var totalPages: Int = totalItems/pageSize 
    if (totalItems % pageSize > 0) totalPages += 1 
    (from, to, totalPages) 
} 

而在接收端:

val (from, to, totalPages) = page(page, pageSize, totalItems) 

雖然它的作品,我敢肯定有更好的可讀性和功能的方式做同樣的事情在斯卡拉。什麼會是更類似scala的方法?

特別是,我試圖找到他說的更好的方式:

var to = from + pageSize - 1 
if (to > totalItems) to = totalItems 

在Java中,我可以這樣做:

from + pageSize - 1 + (to > totalItems) ? 1 : 0; 

回答

1

最簡單的改進就是使用功能,而不是(並避免使用參數名稱遮蓋方法名稱,因此無論您是否調用遞歸函數都更清晰):

def pageCalc(page: Int, pageSize: Int, totalItems: Int) = { 
    val from = ((page - 1) * pageSize) + 1 
    val to = totalItems min (from + pageSize - 1) 
    val totalPages = (totalItems/pageSize) + (if (totalItems % pageSize > 0) 1 else 0) 
    (from, to, totalPages) 
} 

關鍵更改只是使用min函數而不是單獨的var,並且讓if語句返回0或1,而不是使其更新var。問題的

+0

謝謝雷克斯。我同意函數名稱的改變。我只是快速把東西扔在一起,以確保它編譯。 我認爲'min'是一個明顯的改進,'if'解決了var的使用。如果有什麼更簡潔的東西會更好? :在Java中。 – Ike 2010-12-16 22:07:51

+0

@IKE - 沒有內置三元運算符,但可以很容易地定義自己的三元運算符。例如,請參閱http://stackoverflow.com/questions/2705920 – 2010-12-17 02:47:09

+1

我明白了。非常有趣的帖子。對於「相對較少」的收益,它似乎是一個過於複雜的解決方案(甚至不考慮評論中提出的性能影響)。我認爲你上面提出的修改達到了正確的平衡。再次感謝。 – Ike 2010-12-17 04:18:31

8

一半識別模式:

def pageCalc(page: Int, pageSize: Int, totalItems: Int) = { 
    val pages = 1 to totalItems by pageSize 
    val from = pages(page - 1) 
    val to = from + pageSize - 1 min totalItems 
    val totalPages = pages.size 
    (from, to, totalPages) 
} 

雖然,真的,也許你可以只用一個Range直接代替?

+0

作爲一個方面說明,由於簡單的錯誤導致我將代碼變得更加複雜,然後將其簡化爲幾乎與我開始的相同的事情,這讓我印象深刻。 – 2010-12-17 01:19:46

+0

謝謝丹尼爾。我不知道Range中的'by'。這裏有趣的應用程序。我們通過創建一個聰明的集合來避免一些算術運算。我想這是一個品味問題。不知道大量totalItems的性能影響和可伸縮性考慮,但我認爲這些對於大多數實際應用都無關緊要。 – Ike 2010-12-17 04:40:21

+0

@Ike實際上,所有的算術運算都被'Range'隱藏。當我做'pages(page - 1)'時,它和你和Rex做的計算幾乎相同 - 所以它們的性能幾乎相同。實際上,'Range'可能是Scala中最優化的集合。無論如何,主要優點是你不需要「解碼」算術來理解代碼。第二個主要優點是減少錯誤的機會。 – 2010-12-17 10:55:33