Преобразование типовой обработки в типовой класс - PullRequest
4 голосов
/ 26 апреля 2020

У меня есть следующий код:

val byteBuffer = array(0) match {
  case _: Int =>
    ByteBuffer.allocate(4 * array.length)
  case _: Long =>
    ByteBuffer.allocate(8 * array.length)
  case _: Float =>
    ByteBuffer.allocate(4 * array.length)
  case _: Double =>
    ByteBuffer.allocate(8 * array.length)
  case _: Boolean =>
    ByteBuffer.allocate(1 * array.length)
}

Как я могу преобразовать его в класс типа?

Редактировать:

Я был спросил, какой тип массива. Это сложно. Массив объявлен так:

val array = obj.asInstanceOf[mutable.WrappedArray[Any]].array

obj - это параметр, который принимает функция:

val createBuffer = (obj: Any, dType: DataType) => dType match {

Функция вызывается здесь:

val byteBuffer: Option[ByteBuffer] = createBuffer(row.get(i), types(i))

строка является строкой Spark DataFrame.

1 Ответ

4 голосов
/ 26 апреля 2020

A класс типов будет выглядеть следующим образом:

trait ByteSize[T] {
  def tSize: Int
}

object ByteSize {
  implicit final val IntByteSize: ByteSize[Int] =
    new ByteSize[Int] {
      override final val tSize: Int = 4
    }

  implicit final val LongByteSize: ByteSize[Long] =
    new ByteSize[Long] {
      override final val tSize: Int = 8
    }

  // Other instances.
}

object syntax {
  object bytes {
    implicit class ArrayOps[T](private val arr: Array[T]) extends AnyVal {
      final def allocateByteBuffer(implicit ev: ByteBuffer[T]): ByteBuffer =
        ByteBuffer.allocate(ev.tSize * array.length)
    }
  }
}

, который вы можете использовать следующим образом:

import syntax.bytes._

val arr: Array[Int] = ???

val byteBuffer = arr.allocateByteBuffer

Вы можете даже предоставить более полезные методы расширения, такие как вместо того, чтобы просто выделять ByteBuffer , вы можете заполнить его напрямую.


Обратите внимание, помните, классы типов управляются типом, поэтому разрешаются при компиляции время. Если вы не знаете тип вашего массива, тогда это лучшее совпадение с образцом.
Возможно, вы захотите посмотреть, сможете ли вы реорганизовать свой код, чтобы он стал более строгим, поскольку Любой , вообще, считается кодовым запахом. Но если вы не можете или это слишком много для выгоды, классы типов просто не подходят для этой работы.

...