Scala 有没有一种简单的方法来链接那些无效的java setter,而不是返回它
我有一堆自动生成的java代码,我将在scala中调用它们。目前,所有的对象都是用void setters生成的,而不是返回这个值,这使得当你需要设置一堆值时非常烦人。我不打算通过初始化所有内容来使用构造函数,因为这里有50个字段。例如:Scala 有没有一种简单的方法来链接那些无效的java setter,而不是返回它,scala,Scala,我有一堆自动生成的java代码,我将在scala中调用它们。目前,所有的对象都是用void setters生成的,而不是返回这个值,这使得当你需要设置一堆值时非常烦人。我不打算通过初始化所有内容来使用构造函数,因为这里有50个字段。例如: val o = new Obj() o.setA("a") o.setB("b") o.setC("c") 如果我能做这样的事情,那就太酷了 val o = with(new Obj()) { _.setA("a") _.setB("b") _.
val o = new Obj()
o.setA("a")
o.setB("b")
o.setC("c")
如果我能做这样的事情,那就太酷了
val o = with(new Obj()) {
_.setA("a")
_.setB("b")
_.setC("c")
}
我不能将andThen与anon函数一起使用,因为它们需要返回对象。我是坚持目前的做事方式,还是有一些我不知道的神奇之处。您可以使用一个隐式转换器,从/到允许链接的包装类 比如:
case class ObjWrapper(o: Obj) {
def setA(a: String) = { o.setA(a); this }
def setB(b: String) = { o.setB(b); this }
def setC(c: String) = { o.setC(c); this }
}
implicit def wrapped2Obj(ow: ObjWrapper): Obj = ow.o
ObjWrapper(myObj).setA("a").setB("b").setC("c")
实际上,您甚至不需要隐式转换器,因为这些方法已在myObj上调用。当然,您可以使用tap Kestrel combinator,您现在必须自己定义:
implicit class Tapper[A](val a: A) extends AnyVal {
def tap[B](f: A => B): A = { f(a); a }
def taps[B](fs: A => B*): A = { fs.map(_(a)); a }
}
它是这样工作的:
scala> "salmon".taps(
| println,
| println
| )
salmon
salmon
res2: String = salmon
也请注意
val myFavoriteObject = {
val x = new Obj
x.setA("a")
}
将允许您使用一个简短的名称进行所有设置,同时为长期使用指定一个更有意义的名称。请查看。但是请注意,它使用的是宏,因此应该将其视为实验性的。可能的重复:只需导入ObjWrapper。u我相信会更好。