Лучший способ сделать результат подкачки в Scala - PullRequest
4 голосов
/ 17 декабря 2010

Я часто выполняю разбиение по страницам (учитывая номер страницы и размер страницы, рассчитываю начало, конец и общее количество страниц) и портировал эту небольшую функцию из 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;

Ответы [ 2 ]

8 голосов
/ 17 декабря 2010

Половина проблемы заключается в определении шаблона:

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 голос
/ 17 декабря 2010

Самое простое улучшение - это просто использовать функции вместо 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 вместо отдельной переменной и позволяют оператору if возвращать 0 или 1 вместо того, чтобы обновлять переменную.

...