Scala隐式在foreach lambda中不起作用

Scala隐式在foreach lambda中不起作用,scala,lambda,implicit-conversion,Scala,Lambda,Implicit Conversion,我无法获得包含隐式工作的以下代码。变量ls包含一个元组列表,如Tuple2Store implicit中定义的元组列表。我的foreach-lamda参数要求列表的成员是类存储的实例。那么,为什么隐式转换不起作用呢 implicit def Tuple2Store(tuple: (Int, Option[Date], Option[String], Option[Date], Option[Boolean], Option[Boolean], Option[Boolean], O

我无法获得包含隐式工作的以下代码。变量ls包含一个元组列表,如Tuple2Store implicit中定义的元组列表。我的foreach-lamda参数要求列表的成员是类存储的实例。那么,为什么隐式转换不起作用呢

  implicit def Tuple2Store(tuple: (Int, Option[Date], Option[String], Option[Date], Option[Boolean], Option[Boolean],
      Option[Boolean], Option[Boolean], Option[String])): Store =
      { new Store(tuple._1, tuple._2, tuple._3, tuple._4, tuple._5, tuple._6, tuple._7, tuple._8, tuple._9) }

  val entities = TableQuery[StoreTable]
  val query = for {
    c <- entities if c.costCenterNumber === 60506
  } yield (c)

  val ls = query.list

  ls.foreach((s: Store) => println(s.toString))
implicit def Tuple2Store(tuple:(Int,Option[Date],Option[String],Option[Date],Option[Boolean],Option[Boolean],
选项[Boolean],选项[Boolean],选项[String]):存储=
{新存储(元组。_1,元组。_2,元组。_3,元组。_4,元组。_5,元组。_6,元组。_7,元组。_8,元组。_9)}
val entities=TableQuery[StoreTable]
val query=for{
c println(s.toString))
将显示以下错误消息:

  • 类型不匹配;找到:datamodel.Store=>unitrequired:((Int,Option[java.sql.Date],Option[String],Option[java.sql.Date], 选项[Boolean],选项[Boolean],选项[Boolean],选项[Boolean], 选项[字符串])=>
编辑: 下面的代码在ls变量中给了我一个存储实例列表……这是我想要完成的,但是有没有更简单的方法

  implicit def Tuple2Store(tuple: (Int, Option[Date], Option[String], Option[Date], Option[Boolean], Option[Boolean],
      Option[Boolean], Option[Boolean], Option[String])): Store =
      { new Store(tuple._1, tuple._2, tuple._3, tuple._4, tuple._5, tuple._6, tuple._7, tuple._8, tuple._9) }

  val entities = TableQuery[StoreTable]
  val query = for {
    c <- entities if c.costCenterNumber === 60506
  } yield (c)

  val ls = query.list.map { Tuple2Store }
implicit def Tuple2Store(tuple:(Int,Option[Date],Option[String],Option[Date],Option[Boolean],Option[Boolean],
选项[Boolean],选项[Boolean],选项[String]):存储=
{新存储(元组。_1,元组。_2,元组。_3,元组。_4,元组。_5,元组。_6,元组。_7,元组。_8,元组。_9)}
val entities=TableQuery[StoreTable]
val query=for{

c因为隐式函数不是这样工作的。您有一个从
(Int,Option[Date],Option[String],Option[Date],Option[Boolean],Option[Boolean],
选项[Boolean]、选项[Boolean]、选项[String])
Store
,但您需要从
Store=>Unit
转换到
(Int、选项[Date]、选项[String]、选项[Date]、选项[Boolean]、选项[Boolean],
选项[布尔]、选项[布尔]、选项[字符串]=>单位

// just to simplify
type StoreTuple = (Int, Option[Date], Option[String], Option[Date], 
  Option[Boolean], Option[Boolean], Option[Boolean], Option[Boolean], Option[String])

// uses the conversion you've already defined
implicit def convertLambdasWithStoreArguments[A](f: Store => A): StoreTuple => A = 
  tuple => f(tuple) 
但是您可能会发现您需要,例如从
List[StoreTuple]
转换为
List[Store]
,从
Map[Store,A]
转换为
Map[StoreTuple,A]
,等等

您可以使用现有转换并编写

ls.foreach { s => val store: Store = s; println(store.toString) }
相反,或者

ls.foreach { s => println(s.asString) }
其中,
asString
是一种
Store
方法

ls.foreach { s => println(s.toString) }

因为Tuple9已经有了一个
toString
方法,所以它不起作用。

首先,你能不能建设性地找到一个答案,或者直接跳过这个问题?谢谢。其次,我想在这里使用隐式转换,不必因为数据库元组和实际实体对象的区别而打扰开发人员。他们应该只需选择他们需要的,然后将其用作他们喜欢的实体。将
ls
声明为
List[Store]
您就可以开始了,例如
val ls:List[Store]=query.list
@Coxer好的,很抱歉说得太苛刻了。下面再做一次尝试,不要使用隐式转换,因为加入新项目的其他人可以更清楚、更易于维护和理解显式转换。隐式转换是通过“魔术”实现的魔法代码通常是不好的。为什么不把函数放在
yield
的末尾,然后用它来完成呢?把它放在yield块也会给我留下一个错误,这可以用另一个对话来完成?我给出的两行代码不需要另一个转换。如果你想保留自己的行,你可以添加conv我在上面列出了rsion。然后是
map
的另一个转换(尽管它们可以统一),另一个用于
flatMap
,等等。好的,我理解你给出的两行。但我不理解的是你上面列出的转换。实际代码应该是什么样子的?你能写出来吗?如果我说convertLambdasWithStoreArguments转换将lambda Store=>A转换为lambda StoreTuple=>A,那么我是对的吗?如果是,那么它是否也正确?随后使用Tuple2Store转换将StoreTuple转换为Store,以便与convertLambdasWithStoreArguments中f的参数类型要求相匹配?