首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`:‘scala中java集合的头和尾解构

`:‘scala中java集合的头和尾解构
EN

Stack Overflow用户
提问于 2013-09-09 02:49:32
回答 1查看 798关注 0票数 1

我试图为scala中的java集合编写一个“解构函数”。

对于大多数scala集合,我可以使用:: case类解构头/尾中的集合:

代码语言:javascript
复制
scala> val (a :: b) = Seq(1,2)
a: Int = 1
b: List[Int] = List(2)

scala> val (a :: b :: Nil) = Seq(1,2)
a: Int = 1
b: Int = 2

甚至更复杂的情况(例如,将内部清单的前两个要素相加):

代码语言:javascript
复制
scala> val m = Map("a" -> Seq(1,2,3,4), "b" -> Seq(2,3,4,5))
scala> m.collect { case (k, a :: b :: _) => k ->(a+b)}
res5: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 3, b -> 5)

,但我想不出如何在没有无关代码的情况下为java集合工作:

假设我是从外部库获得的,如下所示:

代码语言:javascript
复制
m: java.util.Map[java.lang.String,java.util.List[Int]] = {a=[1, 2, 3, 4], b=[2, 3, 4, 5]}

使用scala<=>java集合转换,我可以将映射转换为scala映射,并处理内部列表,这些列表仍然是java列表:

代码语言:javascript
复制
m.asScala.collect { case (k, jl) => jl.asScala.toList match { case (a :: b :: _) => k->(a+b) } }

代码语言:javascript
复制
m.asScala.map{
     case (k, v) => k -> v.asScala.toList
   }.collect { 
     case (k, a :: b :: _) => k ->(a+b)
   }

我已经找到了unapplySeq matcher技巧,但只有当我知道集合的大小时,才能做到这一点:

代码语言:javascript
复制
object JavaCollection {
  import scala.collection.JavaConverters._
  def unapplySeq[T](array: java.util.Collection[T]): Option[Seq[T]] = Option(array).map(_.asScala.toIndexedSeq)
}

 m.asScala.collect { case (k, JavaCollection(a,b,c,d)) => k ->(a+b)}

如何使::解构不经过显式转换而直接处理Java类型化集合?我已经尝试构建了自己的case class ::[T](head:T, tail: java.util.Collection[T])类,但这似乎还不够。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 03:10:47

使用JavaCollection提取器,您可以在不知道集合的实际长度的情况下对前两个元素进行求和:

代码语言:javascript
复制
scala> val m = Map("a" -> Seq(1,2,3,4,5).asJava, "b" -> Seq(1,2).asJava).asJava
m: java.util.Map[java.lang.String,java.util.List[Int]] = {a=[1, 2, 3, 4, 5], b=[1, 2]}

scala> m.asScala.collect { case (k, JavaCollection(a, b, rest @ _*)) => k -> (a + b) }
res3: scala.collection.mutable.Map[java.lang.String,Int] = Map(a -> 3, b -> 3)

scala>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18690852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档