在Scala中将List [Short]转换为Array [Byte]的最佳方式是什么?
答
考虑位移动和屏蔽等操作来提取Scala/Java的高位和低位字节(与C/C++非常相似);让
val xs = (253 to 257).map(_.toShort).toList
xs: List[Short] = List(253, 254, 255, 256, 257)
等
def upper(x: Short) = ((x >> 8) & 0xFF).toByte
upper: (x: Short)Byte
def lower(x: Short) = (x & 0xFF).toByte
lower: (x: Short)Byte
xs.map(x => (upper(x), lower(x))).toArray
res2: Array[(Byte, Byte)] = List((0,-3), (0,-2), (0,-1), (1,0), (1,1))
其中每个元组收集各Short
值的上部和下部字节。 一种方法来整平以上的元组阵列,
xs.flatMap(x => Array(upper(x), lower(x))).toArray
res3: Array[Byte] = Array(0, -3, 0, -2, 0, -1, 1, 0, 1, 1)
答
这是很容易在斯卡拉的事,其实,你几乎可以从字面上你的问题转换成代码翻译英语句子。假设你有一个名为List[Short]
l
:
l.map(_.toByte).toArray
显然,你需要确保你的所有Short
S IN列表实际上放入一个Byte
,否则你会被截断的结果。
'shorts.flatMap(s => List((s >> 8).toByte,s.toByte))。toArray' – jwvh