Копировать объекты с коллекциями в Scala - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу очистить поля некоторых объектов, которые являются частью коллекций (значение None).Ниже приведена иерархия классов и их структуры

final case class OrderItem(
                                 simpleSku: String,
                                 merchant: Option[String])
final case class OrderItemGroup(id: String,
                                    items: Seq[OrderItem],
                                    fType: Option[String])
final case class OrderRequest(groups: Seq[OrderItemGroup])

val orderItem1 = OrderItem("simple1",Some("merchant1"))
val salesOrderItem2 = OrderItem("simple2",Some("merchant2"))
val salesOrderItem3 = OrderItem("simple3",Some("merchant3"))
val c1 = OrderItemGroup("id1",Seq(orderItem1,salesOrderItem3),Some("fulfillmentA"))
val c2 = OrderItemGroup("id2",Seq(orderItem1,salesOrderItem2),Some("fulfillmentB"))
val o = OrderRequest(Seq(c1,c2))

Я в основном хочу очистить поля merchant и fType и придумать следующий код, но его умножающие внутренние элементы.Как это можно сделать с помощью подхода .copy?

def clearFields (orderRequest:OrderRequest) :OrderRequest = {
  val items = orderRequest.groups.flatMap(x => x.items)
  println("items" + items)
  val groups = orderRequest.groups
  val r = orderRequest.copy(groups = groups.map(_.copy(fType = None, items = items.map(_.copy(merchant = None)))))
  r
}

1 Ответ

3 голосов
/ 26 сентября 2019

Monocle полезен, когда нам нужно скопировать такие вложенные структуры, например,

import monocle.Traversal
import monocle.macros.GenLens
import cats.implicits._ 

val cleanMerchant = GenLens[OrderItem](_.merchant).set(None)
val cleanFType = GenLens[OrderItemGroup](_.fType).set(None)
val cleanGroupItems = Traversal.fromTraverse[List, OrderItemGroup].modify(g => g.copy(items = g.items.map(cleanMerchant)))

OrderRequest(cleanGroupItems(o.groups.toList).map(cleanFType))

output

OrderRequest(List(OrderItemGroup(id1,List(OrderItem(simple1,None), OrderItem(simple3,None)),None), OrderItemGroup(id2,List(OrderItem(simple1,None), OrderItem(simple2,None)),None)))

Чтобы очистить его с помощью ванильного Scala, попробуйте

def cleanOrderItemGroup(group: OrderItemGroup): OrderItemGroup = {
  val items = group.items
  val cleanItems = items.map(cleanOrderItem)
  group.copy(items = cleanItems, fType = None)
}

def cleanOrderItem(item: OrderItem): OrderItem = {
  item.copy(merchant = None)
}

OrderRequest(o.groups.map(cleanOrderItemGroup))

, который снова выводит

OrderRequest(List(OrderItemGroup(id1,List(OrderItem(simple1,None), OrderItem(simple3,None)),None), OrderItemGroup(id2,List(OrderItem(simple1,None), OrderItem(simple2,None)),None)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...