我开始学习scala。不知道是否有人有更好的方法以更实用的方式重写代码。我知道必须有一个。
val buf = ((addr>>24)&0xff) + "." + ((addr>>16)&0xff) + "." + ((addr>>8)&0xff) + "." + ((addr)&0xff)
答案 0 :(得分:11)
这会生成Range(24, 16, 8, 0)
(24 to 0 by -8)
,然后使用addr >> _ & 0xff
将函数map
应用于每个数字。最后,映射的Range
数字与.
“加入”以创建字符串。
地图比使用+
运算符更有用,但其余的只是语法糖和对mkString
的库调用。
val addr = 1024
val buf = (24 to 0 by -8).map(addr >> _ & 0xff).mkString(".")
buf: java.lang.String = 0.0.4.0
答案 1 :(得分:3)
val buf = List(24,16,8,0).map(addr >> _).map(_ & 0xff).mkString(".")
这是我将如何做到这一点,类似于Brian的答案,但是使用Scala着名的'_'运算符,有一个简短的值列表和两个简单的map()方法。好问题!
答案 2 :(得分:2)
有些人会发现理解能力更具可读性:
(for (pos <- 24 to 0 by -8) yield addr >> pos & 0xff) mkString "."
答案 3 :(得分:-2)
优点是输入 - 可以是任意数量的整数
// trick
implicit class When[F](fun: F) {
def when(cond: F => Boolean)(tail: F => F) = if (cond(fun)) tail(fun) else fun
}
// actual one-liner
12345678.toHexString.when(1 to 8 contains _.length % 8)
(s => "0" * (8 - s.length % 8) + s ).reverse.grouped(2).map
(Integer.parseInt(_, 16)).toList.reverse.mkString(".")
// 0.203.22.228
// a very big IPv7
BigInt("123456789012345678901").toString(16).when(1 to 8 contains _.length % 8)
(s => "0" * (8 - s.length % 8) + s ).reverse.grouped(2).map
(Integer.parseInt(_, 16)).toList.reverse.mkString(".")
// 0.0.0.96.27.228.249.24.242.99.198.83
修改
由于downvotes的解释。 implicit class When
可以只是一个库类,它在2.10
中工作,并允许有条件地执行调用链中的一些函数。我没有衡量表现,也不关心,因为一个例子本身就是一个可能,优雅与否的例证。