什么是Scala编写此代码的方式?

时间:2013-12-30 03:34:08

标签: scala optimization functional-programming

我想从列表中的每个项目的开头删除“America /”这个词,下面的代码就是这样,但我觉得它可以用更好的方式完成。

var tz = java.util.TimeZone.getAvailableIDs
for(i <- 0 until tz.length) {
    if(tz(i).startsWith("America/")) {
        tz(i) = tz(i).replaceFirst("America/", "")
    }
}

8 个答案:

答案 0 :(得分:3)

简单直接:

val tz = java.util.TimeZone.getAvailableIDs.map(_.replaceFirst("^America/", ""))

答案 1 :(得分:2)

与@ Noah的答案非常相似,但是使用for-yield迭代(这样您就可以添加其他过滤器而不再使用括号)。

import java.util.TimeZone
val tz = for(t <- TimeZone.getAvailableIDs) yield t.replaceFirst("^America/", "")

答案 2 :(得分:1)

我将使用正则表达式:

val pattern = "^America/".r
tz = tz.map(pattern.replaceFirstIn(_, ""))

想知道这是否是一种有效的方式。

答案 3 :(得分:0)

Map优先用于函数式编程中的for循环,因此不是使用for循环更改列表,而是通过映射传递数据更纯粹,(IMO)更漂亮。

答案 4 :(得分:0)

这可行:

val tzs = java.util.TimeZone.getAvailableIDs map { tz =>
  if(tz.startsWith("America/")) tz.replaceFirst("America/","")
  else tz
}

答案 5 :(得分:0)

如果你只想要美国时区,你可以这样做:

val americanZones = {
  val pattern = "^America/(.*)".r
  ( java.util.TimeZone.getAvailableIDs
    flatMap pattern.findFirstMatchIn
    map (_ group 1) )
}

答案 6 :(得分:0)

添加了&#39; if&#39;到for / yield

val zones = java.util.TimeZone.getAvailableIDs
val formatted_zones = for(i <- 0 until zones.length if zones(i).startsWith("America/")) yield {
  zones(i).replaceFirst("America/", "")
}

答案 7 :(得分:0)

没有正则表达式:

val tz = java.util.TimeZone.getAvailableIDs.map(_ stripPrefix "America/")