Protobuf转换为scala

时间:2018-02-08 19:33:25

标签: scala protocol-buffers

我有protobuf

message ResultsPb{
    repeated int32 Result = 1;
}

和scala中的对应

Results: List[Int]

我是新手,我很难找到从一个转换到另一个的正确方法。这是我到目前为止所提出的,但并不完全确定。第一个def不构建,第二个def构建。

def toResults(resultsPb: Option[ResultsPb]): List[Int] ={
  List[Int](resultsPb.Result)
}

def fromResults(results: List[Int]): Option[ResultsPb] ={
  Some(ResultsPb (results.toSeq))
}

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

def toResults(resultsPb: Option[ResultsPb]): List[Int] ={
  resultsPb.toList.flatMap(_.Result)
}

def fromResults(results: List[Int]): Option[ResultsPb] ={
  Some(results).filter(_.nonEmpty).map(t => ResultPb(t))
}

<强>更新

因此,要将可选的proto类转换为其参数,您需要

  • 检查该选项是否为空
  • 从班级
  • 中提取数据

这可以像Bob提出的那样(使用模式匹配),或者使用flatMap进行简化(但在需要将Option转换为Seq / List以满足类型检查之前)

在第二种方法中,你可以再次使用if语句(检查List是否为空),匹配(用&#34检查相同; case _ :: Nil =&gt; ... case Nil =&gt; &#34;)或者我提议过滤空结果并在这种情况下自动获取无。