Подтвердить что ты не робот

Есть ли что-то вроде AutoMapper для Scala?

Я искал некоторый свободный scala API для отображения объекта-объекта, аналогичный AutoMapper. Существуют ли такие инструменты в Scala?

4b9b3361

Ответ 1

Я думаю, что меньше чем-то вроде AutoMapper в Scala, потому что, если вы используете идиоматические модели Scala, легче писать и манипулировать, и потому что вы можете легко определить автоматическое сглаживание/проецирование с помощью неявных преобразований.

Например, здесь приведен эквивалент в Scala файла AutoMapper :

// The full model

case class Order( customer: Customer, items: List[OrderLineItem]=List()) {
  def addItem( product: Product, quantity: Int ) = 
    copy( items = OrderLineItem(product,quantity)::items )
  def total = items.foldLeft(0.0){ _ + _.total }
}

case class Product( name: String, price: Double )

case class OrderLineItem( product: Product, quantity: Int ) {
  def total = quantity * product.price
}

case class Customer( name: String )

case class OrderDto( customerName: String, total: Double )


// The flattening conversion

object Mappings {
  implicit def order2OrderDto( order: Order ) = 
    OrderDto( order.customer.name, order.total )
}


//A working example

import Mappings._

val customer =  Customer( "George Costanza" )
val bosco = Product( "Bosco", 4.99 )
val order = Order( customer ).addItem( bosco, 15 )

val dto: OrderDto = order // automatic conversion at compile-time !

println( dto ) // prints: OrderDto(George Costanza,74.85000000000001)

PS: Я не должен использовать Double для денежных сумм...

Ответ 2

Я согласен с @paradigmatic, правда, что код будет намного чище с помощью Scala, но иногда вы можете найти сопоставление между классами case, которые выглядят очень похожими, и что это просто отходы нажатия клавиш.

Я начал работу над проектом для решения проблем, вы можете найти его здесь: https://github.com/bfil/scala-automapper

Он использует макросы для создания сопоставлений для вас.

В настоящий момент он может сопоставить класс case с подмножеством исходного класса case, он обрабатывает необязательные поля и необязательные поля, а также другие незначительные вещи.

Я все еще пытаюсь понять, как создать api для поддержки переименования или сопоставления определенных полей с помощью пользовательской логики, любая идея или ввод на этом будут очень полезны.

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

Библиотека также позволяет вручную определять типы Mapping между классами case в любом случае, которые могут предоставляться как неявный параметр методу AutoMapping.map(sourceClass) или sourceClass.mapTo[TargetClass].

UPDATE

Я только что выпустил новую версию, которая обрабатывает Iterables, Maps и позволяет передавать динамические сопоставления (например, для поддержки переименования и пользовательской логики)

Ответ 3

Для сложных отображений можно подумать о Java-манипуляторах, таких как

Объекты

Scala могут быть доступны из Java:

Реализации неявных преобразований для сложных объектов будут более гладкими с декларативными сопоставлениями, чем с ручной обработкой.

Найдите более длинный список здесь:

http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html