我有一个场景,我想实现一个Cake Pattern的变体,但是向一个类添加隐式功能(一个Spark DataFrame).
所以,基本上,我希望能够运行如下代码:
trait Transformer {
this: ColumnAdder =>
def transform(input: DataFrame): DataFrame = {
input.addColumn("newCol")
}
}
val input = sqlContext.range(0, 5)
val transformer = new Transformer with StringColumnAdder
val output = transformer.transform(input)
output.show
Run Code Online (Sandbox Code Playgroud)
并找到如下结果:
+---+------+
| id|newCol|
+---+------+
| 0|newCol|
| 1|newCol|
| 2|newCol|
| 3|newCol|
| 4|newCol|
+---+------+
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是仅在基本特征中定义隐式类:
trait ColumnAdder {
protected def _addColumn(df: DataFrame, colName: String): DataFrame
implicit class ColumnAdderRichDataFrame(df: DataFrame) {
def addColumn(colName: String): DataFrame = _addColumn(df, colName)
}
}
trait StringColumnAdder extends …Run Code Online (Sandbox Code Playgroud) 我正在开发一个基于的应用程序microservice architecture.在这里,每个service都是可独立部署的play-scala application曝光rest apis.我想Api gateway在这些服务之上实现映射传入请求.我遵循这里讨论的架构:构建微服务
很少有基于微服务架构的具有实质成熟度的项目.其中一个是Reactive Microservices.但是这个项目没有使用api gateway pattern,似乎跟着反模式这个项目有一个问题,关于这里丢失的Api网关.这里的贡献者声称他们没有遵循,api gateway pattern因为它有风险single-point of failure.
这种不同的意见对我来说非常混乱.所以,我正在寻找关于我是否应该使用Api Gateway的建议.What is the right practice here ?
我有一个以下结构的scala列表:
val list = List(
List(a1,a2,a3,a4,a5),
List(b1,b2,b3,b4,b5),
List(c1,c2,c3,c4,c5)
)
Run Code Online (Sandbox Code Playgroud)
从这个列表中,我想生成一个如下所示的列表:
List(
List(a1,b1,c1),
List(a2,b2,c2),
List(a3,b3,c3),
List(a4,b4,c4),
List(a5,b5,c5)
)
Run Code Online (Sandbox Code Playgroud)
我如何在scala中实现这一点?
我正在编写一个使用无形的泛型函数,它接受a的实例case class并修剪字符串的所有字段值.案例类可以有可选字段,嵌套对象,列表等.
我有一个案例课Person.
case class Person(name: Option[String], address: List[String], friends: List[Person])
Run Code Online (Sandbox Code Playgroud)
我目前拥有的功能:
import shapeless._, ops.hlist._
object trimmer extends Poly1 {
implicit val stringOptCase = at[Option[String]](_.map(_.trim))
implicit val stringListCase = at[List[String]](_.map(_.trim))
implicit def skipCase[A] = at[A](identity)
}
def trimStringValues[A, R <: HList](a: A)(implicit
gen: Generic.Aux[A, R],
mapper: Mapper.Aux[trimmer.type, R, R]
) = gen.from(mapper(gen.to(a)))
Run Code Online (Sandbox Code Playgroud)
当我使用上面的函数时,它只适用于类的根级别name字段Person.它不适用于列表或对象字段.
val person = Person(name = Some(" john "), address = List(" ny"," vegas "), friends = List(Person(Some(" …Run Code Online (Sandbox Code Playgroud) 我想手动编写dockerfile而不使用任何sbt插件.我正在使用sbt 0.13.8.我查看了dockerfile参考,但无法获得足够的洞察力来满足我的要求.演示非常有用
但我无法理解event driven architectures和之间的核心差异message driven architectures.结果,我也无法理解为什么reactive manifesto更喜欢Message Driven systems而不是那Event Driven个人的原因.
我还看了一下这次访谈,其中Martin Thompson讨论了反应性宣言.
但是,我无法清楚地区分这两种架构,它们的优点和用例.
我有一个Student列表,我想从中找到最后一个匹配的年龄为23岁的学生。
我知道该find()方法为我们提供了第一个匹配项,如下所示:
case class Student(id: Int, age: Int)
val students = List(Student(1, 23), Student(2, 24), Student(3, 23))
val firstStudentWithAge23 = students.find(student => student.age == 23)
// Some(Student(1, 23))
Run Code Online (Sandbox Code Playgroud)
这段代码给了我第一个匹配的学生。但是我需要最后一个匹配的学生。
现在,我使用的reverse方法是find:
val lastStudentWithAge23 = students.reverse.find(student => student.age == 23)
// Some(Student(3,23))
Run Code Online (Sandbox Code Playgroud)
这给了我最后一个匹配的学生。
但这似乎不是一个好方法,因为必须首先将整个列表颠倒。我怎样才能以更好的功能实现这一目标?
我的play 2.4.x应用程序中有很多控制器.
我想得到一个all route URLs指向各自控制器的列表.我知道如何从当前请求中获取URL.但我需要一个播放应用程序中可用的所有URL列表.我想generate this list dynamically because URLs can be changed/added/deleted in future.
那么,有什么方法可以动态生成这个URL列表?或者我是否有义务将所有URL静态存储在缓存或字典中的某个位置?
我有一个很难理解的目的和意义NotUsed,并Done在阿卡流.
让我们看看以下2个简单的例子:
使用NotUsed:
implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()
val myStream: RunnableGraph[NotUsed] =
Source.single("stackoverflow")
.map(s => s.toUpperCase())
.to(Sink.foreach(println))
val runResult:NotUsed = myStream.run()
Run Code Online (Sandbox Code Playgroud)
使用完成
implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()
val myStream: RunnableGraph[Future[Done]] =
Source.single("stackoverflow")
.map(s => s.toUpperCase())
.toMat(Sink.foreach(println))(Keep.right)
val runResult: Future[Done] = myStream.run()
Run Code Online (Sandbox Code Playgroud)
当我运行这些示例时,在两种情况下都得到相同的输出:
STACKOVERFLOW //output
Run Code Online (Sandbox Code Playgroud)
那么NotUsed和Done到底是什么?有什么区别,什么时候我应该优先于另一个?
我已经看过一些博客Pimp my Library pattern,这些似乎适用于向类添加行为.
但是,如果我有一个case class,我想要add data members它呢?作为一个案例类我不能扩展它(从案例类继承被弃用/强烈建议不鼓励).这些pimp模式是否允许我将数据添加到案例类?
scala ×7
akka ×1
akka-stream ×1
apache-spark ×1
case ×1
class ×1
docker ×1
event-driven ×1
list ×1
sbt ×1
shapeless ×1
typesafe ×1