我经常进行分页(给定页码和页面大小计算开始页,结束页和总页数),我从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中有更多可读和功能性的方法来做同样的事情。什么是更像scala的方法?
特别是,我正试图找到一种更好的说法:
var to = from + pageSize - 1
if (to > totalItems) to = totalItems
在Java中我可以做类似的事情:
from + pageSize - 1 + (to > totalItems) ? 1 : 0;
答案 0 :(得分: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
代替?
答案 1 :(得分:1)
最简单的改进就是使用函数而不是vars(并避免使用参数名称隐藏方法名称,因此无论是否调用递归函数都更清楚):
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。