2010-12-16 4 views
4

я привести пейджинг часто (с учетом номера страницы и начало размера страницы высчитывают, конец и общее количество страниц), и я портировал эту маленькую функцию из Java, чтобы помочь:Лучший способ сделать результат пейджинга в Scala

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; 

ответ

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

Спасибо Rex. Я согласен с изменением имени функции. Я просто что-то бросил, чтобы убедиться, что он скомпилирован. Я думаю, что «мин» - это четкое улучшение, а «if» решает использовать var. Было бы лучше, если бы было что-то еще более краткое? : на Java. – Ike 2010-12-16 22:07:51

+0

@Ike - В тройку встроен не встроенный оператор, но вы можете легко определить свой собственный. См. Например, http://stackoverflow.com/questions/2705920 – 2010-12-17 02:47:09

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 непосредственно вместо этого?

Смежные вопросы