java - `::` scala中java集合的头尾解构

标签 java scala collections compatibility matcher

我正在尝试为 scala 中的 java 集合编写一个“解构器”。

对于大多数 Scala 集合,我可以使用 :: 案例类来解构头/尾中的集合:

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

甚至更复杂的情况(例如,将内部列表的前两个元素相加):

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 集合工作:

假设我从外部库中得到这样的东西:

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 的内部列表:

m.asScala.collect { case (k, jl) => jl.asScala.toList match { case (a :: b :: _) => k->(a+b) } }

m.asScala.map{
     case (k, v) => k -> v.asScala.toList
   }.collect { 
     case (k, a :: b :: _) => k ->(a+b)
   }

我找到了 unapplySeq 匹配器技巧,但这只有在我知道集合大小时才有效:

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]) 类,但这似乎还不够。

最佳答案

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

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>

关于java - `::` scala中java集合的头尾解构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690852/

相关文章:

Scala 宏 : finding Option's enclosed type

scala - 使用 scala 2.12.10 时 Spark 的 pom.xml 依赖项

java - 为什么 LinkedList 在 java 中没有 initialCapacity?

java - 在 Java 中按属性映射对象集合

java - 我应该如何管理 Android 中的蓝牙连接?

java - 为什么Struts 2依赖于springframework?

java - Scala 从扩展 java 类的基类调用 super

java - 正则表达式在java中查找字符串中的特定单词

java - 使用 Eclipse 连接到 wamp 服务器的 IOException 错误?

java - Java 中另一个对象内的对象循环