scala中的推断参数类型

时间:2016-01-14 16:30:19

标签: scala apache-spark hbase

以下代码生成类型不匹配错误。我不明白为什么。

var navigablemap=rst.getFamilyMap("a".getBytes())
var list = new ListBuffer[Long]()
navigablemap.keySet().forEach((e:Array[Byte]) => list+=Bytes.toLong(e))

navigablemap 的类型为 NavigableMap [A​​rray [Byte],Array [Byte]] 。 人们希望 e 具有类型数组[字节]

编译器报告以下错误消息。

类型不匹配; found:Array [Byte]⇒list.type(带底层类型Array [Byte]⇒list.type)必需:java.util.function.Consumer [_&gt ;: Array [Byte]]

更新:以下工作。

var keys=navigablemap.keySet()
var keysIterator=keys.iterator()
while (keysIterator.hasNext){ 
  var e=keysIterator.next()
  list+=Bytes.toLong(e)
}

由于简洁是我尝试学习scala时的目标之一,上面是否有scala-one-liner?

1 个答案:

答案 0 :(得分:0)

这是一个愚蠢的错误。正如Lukasz对这个问题所评论的那样,scala lambdas无法取代java lambda。对于将来的参考,这是可行的解决方案。

var navigablemap=rst.getFamilyMap("a".getBytes())
val list = new ListBuffer[Long]()
var keys=navigablemap.keySet()
val scalaKeys=asScalaSet(keys)
scalaKeys.foreach(x => list+=Bytes.toLong(x))

转化asScalaSet很重要。