【问题标题】:What is the best way to convert a List[Short] to Array[Byte] in Scala?在 Scala 中将 List[Short] 转换为 Array[Byte] 的最佳方法是什么?
【发布时间】:2016-08-19 04:49:14
【问题描述】:

这在 C/C++ 中非常简单,但我想知道 Scala 中最优雅的方式是什么?谢谢!

【问题讨论】:

  • shorts.flatMap(s => List((s >> 8).toByte, s.toByte)).toArray

标签: scala type-conversion bytearray short


【解决方案1】:

考虑位操作,例如移位和屏蔽,以提取 Scala/Java Short 的高字节和低字节(采用与 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)

【讨论】:

    【解决方案2】:

    这在 Scala 中很容易做到,事实上,您几乎可以将问题中的英文句子直接翻译成代码。假设您有一个名为lList[Short]

    l.map(_.toByte).toArray
    

    显然,您需要确保列表中的所有Shorts 实际上都适合Byte,否则您将得到截断的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2023-04-11
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2013-12-22
      相关资源
      最近更新 更多