小编Vik*_*dya的帖子

高效优雅地从案例类结构的List中删除元素

我有一个嵌套的case类结构List

为简单起见,请使用以下示例 -

case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, addresses: List[Address])
case class Department(people: List[Person])
Run Code Online (Sandbox Code Playgroud)

说有List[Department]; 现在,如果我想List[Department]通过过滤Address每个Person没有特定zipCode值的新东西来创建一个新的; 传统上我们可以做到以下

def filterPersonsByAddress(dlist: List[Department]): List[Department] = {
  dlist.map { d =>
    val people = d.people.map { p => 
      p.copy(addresses = p.addresses.filterNot(_.zipCode == 38978))}
      d.copy(people=people)
    }
 }
Run Code Online (Sandbox Code Playgroud)

这种方法不具备性能,因为取决于嵌套级别,它可以是Big O(n ^ 2)或Big O(n ^ 3);

我试图通过Monocle学习镜头.到目前为止,我学到的是当你必须"修改"一个深层嵌套的case类结构但尚未找到一种方法根据条件"切断"嵌套结构的某些部分并返回一个新结构时,镜头很有用.这可能是通过Monocle吗?此外,我不确定Lenses是否能够帮助实现更好的Big O时间?

scala lenses monocle-scala

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

没有Json格式化程序发现Scala,Play框架错误

我有以下两个含义.

implicit val readObjectIdFormat = new Reads[ObjectId] {
def reads(jv: JsValue): JsResult[ObjectId] = {
  JsSuccess(new ObjectId(jv.as[String]))
 }
}

implicit val visitorFormat = (
(__ \ "_id").formatOpt[ObjectId] and
(__ \ "visitorId").format[String] and
(__ \ "referralUrl").formatOpt[String] and
(__ \ "ipAddress").formatOpt[String] and
(__ \ "promotionId").format[String])(Visitor)  
Run Code Online (Sandbox Code Playgroud)

虽然readObjectIdFormat是在编译时定义的,但它继续抱怨"(__ \"_ id").formatOpt [ObjectId]"line

找不到类型为org.bson.types.ObjectId的Json格式化程序.尝试为此类型实现隐式格式.

版本:播放2.1-RC2,Scala 2.10

知道为什么它不能识别readObjectIdFormat吗?

scala playframework

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

在组成两个defs后展平类型

以下是一个玩具示例,以展示现实生活遗留方法的形状怪异和问题的要点.

正如您所看到的anotherFunc,在将personListexpands类型映射到\/[Throwable,List[\/[Throwable,String]]]不是返回类型但是maping的效果之后personList.再次下面的内容anotherFunc是为了演示目的(实际上有更多有意义的事情发生而不是Option("fakeString")或任何一个.

要求是map personList,如果它right然后对List[Person]返回的每个元素right(从析取返回的一侧)做一些事情.

如何简化/展平返回类型anotherFunc(返回\/[Throwable,List[String]]).可能正在使用其他组合器?

case class Person(name :String)

def personList : \/[Throwable,List[Person]] ={
  \/.fromTryCatch{
    List(Person("John"))
  }
} 

def anotherFunc  : \/[Throwable,List[\/[Throwable,String]]]= {
  personList.map{ pl =>
    pl.map{p =>
      for{
        s <- Option("fakeString").\/>(new Throwable("not found"))
      } yield s

    }

  }
}
Run Code Online (Sandbox Code Playgroud)

scala scalaz

6
推荐指数
2
解决办法
265
查看次数

如何压扁析取类型

如果我有以下方法

 def getMyList :\/[Throwable,List[\/[Throwable,Int]]] ={
 ....
 }
Run Code Online (Sandbox Code Playgroud)

如何扁平化的类型getMyList\/[Throwable,List[Int]]

scala scalaz

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

放弃在Option上调用`get`并生成编译错误

如果我想在调用.get任何Option值时生成编译时错误,如何执行此操作?

没有编写任何自定义宏但是猜测它是时候了吗?有什么指针吗?

scala scalaz

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

在ScalaTest中组合测试夹具的更好方法

我们有使用贷款模式的测试装置.利用此模式创建运行测试所需的"种子数据".当测试依赖于数据时例如以下

"save definition" should {
"create a new record" in withSubject { implicit subject =>
  withDataSource { implicit datasource =>
    withFormType { implicit formtype =>

        val definitn = DefinitionModel(-1, datasource.id, formtype.id, subject.role.id, Some(properties))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

其中withSubject,withDataSource,withFormType是测试夹具返回subject,dataSource,formType从数据库数据分别.withDataSource夹具需要subject隐含.建筑DefinitionModel要求datasource.idformtype.id.所以根据测试的数据要求调用这样的数据构建器夹具会产生很多嵌套的夹具情况.有没有更好的方法来"组合"/构建这样的灯具?

scala composition scalatest

6
推荐指数
2
解决办法
3169
查看次数

变量和val的Scala内部

Scala中var和val的内部实现是什么?有兴趣知道他们的实现的细节 - 是什么使var变为"var"如何实现可变结构vs val(更像是最终的)结构,这使得它是不可变的.

scala

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

异构映射,编译时的依赖类型

试图通过Miles Sabin 使用这个技巧来创建一个只接受一组预定义参数的函数types.

val bool =  Boolean
val timestamp = new Timestamp(date.getTime())
val str = "My String"
Run Code Online (Sandbox Code Playgroud)

然后跟随应该在编译时通过

takeValue(bool)
takeValue(timestamp)
takeValue(str)
Run Code Online (Sandbox Code Playgroud)

这里takeValue应该失败takeValue(someIntValue),如果implicit用于type Int不defined.And这种故障会在编译的时候.

trait MyConv[K] { type V; def convert: AnyRef => V }

def iMakeConv[V0](con: AnyRef => V0) = new MyConv[con.type] {
  override type V = V0
  val convert = con
}

  def takeValue(value:AnyRef)(implicit conv :MyConv[value.type]) : \/[Throwable,conv.V] = \/.fromTryCatch(conv.convert(value))
Run Code Online (Sandbox Code Playgroud)

然后

implicit val strAny = iMakeConv((x:Any) …
Run Code Online (Sandbox Code Playgroud)

scala shapeless

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

序列与元组分离的列表

sequenceU在scalaz中使用disjunctions时用来转换内部类型.

例如

val res = List[\/[Errs,MyType]]

res.sequenceU 会给 \/[Errs,List[MyType]]

现在,如果我有一个val res2 = List[(\/[Errs,MyType], DefModel)]- List含有分离的元组; 什么是正确的转换方式

res2\/[Errs,List[ (Mype,DefModel)]

scala scalaz

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

案例类修改和设计通用方法

为了这篇文章的目的,代码片段被轻视,抽样.

case class Person(firstName:String,lstName:String)
Run Code Online (Sandbox Code Playgroud)

此人类已在代码库中的所有位置使用.现在,后来的需求发生了变化,并决定phoneNumber在人案例类中添加

例如

case class Person(firstName:String,lstName:String,phoneNumber:String)
Run Code Online (Sandbox Code Playgroud)

再次,帖子中的例子极为简化.实际上,有更多有趣的事情正在发生.请注意,这phoneNumber不是Option必填字段.通常,人们会更新所有使用Person类的代码,以满足新领域的需求lastName.当你有100个引用它时,这是相当繁琐的.

HList从get get vs case class 创建更灵活的无形帮助?

scala shapeless

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

如何将包含String和Seq [String]值的Scala映射转换为JSON?

在使用Scala的Play Framework中,如何将String和Seq [String]值的Map转换为JSON格式?以下代码为我生成错误:

val objMap = Map("id" -> "id", "tags" -> Seq("tag1", "tag2"))
Json.toJson(objMap)
Run Code Online (Sandbox Code Playgroud)

结果错误:

No Json serializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
Run Code Online (Sandbox Code Playgroud)

json scala playframework scala-2.10

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

创建索引映射时找不到分析器

analyzer_keyword创建索引时添加了新的分析器- 请参阅下面的create index

curl -XPUT 'http://mycluster/dsi2' -d '{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "analysis": {
        "analyzer": {
          "analyzer_keyword": {
            "tokenizer": "keyword",
             "filter": "lowercase"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

运行_settings端点确认以下内容

http GET http://mycluster/dsi2/_settings
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 267
Content-Type: application/json; charset=UTF-8

{
    "dsi2": {
        "settings": {
            "index": {
                "analysis": {
                    "analyzer": {
                        "analyzer_keyword": {
                            "filter": "lowercase", 
                            "tokenizer": "keyword"
                        }
                    }
                }, 
                "creation_date": "1484088347598", 
                "number_of_replicas": "1", 
                "number_of_shards": "1", 
                "uuid": "Lu98fn6gRiOe3Q1y8fU6tQ", 
                "version": …
Run Code Online (Sandbox Code Playgroud)

elasticsearch

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