小编mik*_*ike的帖子

Scala Macro获得术语名称的值

我有以下代码:

usage.scala

object Test extends App {
   import Macros._

   val f = 1
   Macros.get(f) 
}
Run Code Online (Sandbox Code Playgroud)

macros.scala

import language.experimental.macros
import scala.reflect.macros.Context

object Macros {
  def get(a: Int) = macro getImpl

  def getImpl(c: Context)(a: c.Expr[Int]) = {
    import c.universe._

     println(showRaw(a))
  }
}    
Run Code Online (Sandbox Code Playgroud)

它返回:

Expr(Select(This(newTypeName("Test")), newTermName("f")))

如何从termName("f")一个1值中提取?有可能用宏吗?

scala scala-macros

6
推荐指数
1
解决办法
1681
查看次数

无形转换案例类到HList并跳过所有选项字段

我有下一堂课:

case class Foo(a: Option[Int], b: Option[String], c: Option[Double])
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,所有字段都是可选的,我希望将此类转换为HList或Tuple,就像

val f1 = Foo(Some(1) , None, Some(3D))
val f2 = Foo(None, "foo")

val result1 = f1.to[Int::Double::HNil] // => 1::3D
val result2 = f2.to[String::HNil] // "foo"
Run Code Online (Sandbox Code Playgroud)

没有反思可能吗?

scala shapeless

6
推荐指数
1
解决办法
752
查看次数

无形的案例类转换

我使用shapeless进行case类转换,我有一个2个案例类:

import shapeless._

case class Foo(id: Int, name: String)
case class Bar(id: Int, name: String, price: Double)

val fooGen = Generic[Foo]
val barGen = Generic[Bar]

val foo = Foo(1, "foo")
val fooRepr = fooGen.to(foo)
val additional = fooRepr :+ 1.0
val bar = barGen.from(additional)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但当我尝试将Bar转换为Foo时

fooGen.from(barGen.to(bar))
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

found   : main.barGen.Repr
[error]     (which expands to)  shapeless.::[Int,shapeless.::    [String,shapeless.::[Double,shapeless.HNil]]]
[error]  required: main.fooGen.Repr
[error]     (which expands to)  shapeless.::[Int,shapeless.::[String,shapeless.HNil]]
[error]   println(fooGen.from(barGen.to(bar)))    
Run Code Online (Sandbox Code Playgroud)

是否有可能将一个案例类转换为更多字段而不是另一个案例类?

scala shapeless

4
推荐指数
1
解决办法
1884
查看次数

kafka-streams join 产生重复项

我有两个主题:

// photos
{'id': 1, 'user_id': 1, 'url': 'url#1'},
{'id': 2, 'user_id': 2, 'url': 'url#2'},
{'id': 3, 'user_id': 2, 'url': 'url#3'}

// users
{'id': 1, 'name': 'user#1'},
{'id': 1, 'name': 'user#1'},
{'id': 1, 'name': 'user#1'}
Run Code Online (Sandbox Code Playgroud)

我按用户创建地图照片

KStream<Integer, Photo> photo_by_user = ...

photo_by_user.to("photo_by_user")
Run Code Online (Sandbox Code Playgroud)

然后,我尝试连接两个表:

KTable<Integer, User> users_table = builder.table("users");
KTable<Integer, Photo> photo_by_user_table = builder.table("photo_by_user");
KStream<Integer, Result> results = users_table.join(photo_by_user_table, (a, b) -> Result.from(a, b)).toStream();

results.to("results");
Run Code Online (Sandbox Code Playgroud)

结果就像

{'photo_id': 1, 'user': 1, 'url': 'url#1', 'name': 'user#1'}
{'photo_id': 2, 'user': 2, 'url': 'url#2', 'name': …
Run Code Online (Sandbox Code Playgroud)

apache-kafka apache-kafka-streams

1
推荐指数
1
解决办法
1774
查看次数