如何使这个条件更像Scala

时间:2011-08-23 14:09:48

标签: java scala idiomatic

我有以下方法:

def generateAssociatedImages : List[ImageFileEntry] = {

    if ( this.page > 1 && this.page < this.fileEntry.pageCount ) {
        List( copyWithPage( this.page - 1 ), copyWithPage( this.page + 1 ) )
    } else {
        if ( page == 1 && page != file.fileEntry.pageCount ) {
            List( copyWithPage( this.page + 1 ) )
        } else {
            List( copyWithPage( this.page - 1 ) )
        }
    }

}

但是这个看起来太像Java了(如果我使用Ruby,我会在一个范围上做一个开关/案例,然后进行其他比较)。在Scala中有更强大的功能吗?

行为很简单:

  • 如果输入为第1页且总页数为3,则输出为[2]
  • 如果输入为第2页且总页数为3,则输出为[1,3]
  • 如果输入为第3页且总页数为3,则输出为[2]

我正在寻找一种惯用的解决方案,我还是Scala的新手。

如果我可以这样做,那将是可爱的:

( 1 until 3 ).hasNext( 2 )

3 个答案:

答案 0 :(得分:7)

假设在一个页面上,图像列表为空,您可以拥有以下内容:

def generateAssociatedImages: List[ImageFileEntry] = {
    val pageCount = fileEntry.pageCount
    page match {
        case `pageCount` if page == 1 => List()
        case `pageCount` => List(copyWithPage(pageCount - 1))
        case 1 => List(copyWithPage(2))
        case x => List(copyWithPage(x - 1), copyWithPage(x + 1))
    }
}

答案 1 :(得分:2)

def ifTrue[T](c : Boolean, v : =>T) = if (c) Some(v) else None

def generateAssociatedImages = List(ifTrue(this.page > 1, -1)), ifTrue(this.page < this.fileEntry.pageCount, 1)).flatten.map(d => copyWithPage(this.page + d))

答案 2 :(得分:0)

您在寻找相邻的页面吗?

val pages = 1 to this.fileEntry.pageCount

implicit def toNext(r: Range) = new { 
    def next(n: Int) = r.view sliding 2 find (n == _.head) map (_.last)
}

def adjacent(page: Int) = List(pages next page, pages.reverse next page).flatten

def generateAssociatedImages : List[ImageFileEntry] = 
    adjacent(this.page) map copyWithPage

我承认,这有点过度工程。但它很优雅。由于sliding中存在错误,它对单页范围也不起作用。