2010-12-16 39 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