[英]Scala sortBy Missing parameter type for expanded function
我已经创建了这样的列表列表,我可以根据大小轻松对其进行排序。
@ List(List(2, 2, 3), List(7)).sortBy(_.size)
res71: List[List[Int]] = List(List(7), List(2, 2, 3))
但是,如果我有重复的列表,我想消除我可以做的重复
@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList
res72: List[List[Int]] = List(List(2, 2, 3), List(7))
你可以看到上面列表的数据类型仍然是List [List [Int]]
现在,如果我尝试
@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(_.size)
cmd73.sc:1: missing parameter type for expanded function ((x$2: <error>) => x$2.size)
val res73 = List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(_.size)
^
Compilation Failed
我也试过了
@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(x => x.size)
cmd73.sc:1: missing parameter type
val res73 = List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(x => x.size)
^
Compilation Failed
我有点困惑。 我手动构建的List [List [Int]]与从toList函数返回的List [List [Int]]有什么区别? 为什么我可以在第一个上调用sortBy
,但我不能在第二个上调用sortBy?
在上面的例子中, .toSet
丢失了List[T]
元素类型,
def toSet[B >: A]: immutable.Set[B] = to[immutable.Set].asInstanceOf[immutable.Set[B]]
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach(x => println(x))
<console>:12: error: missing parameter type
List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach(x => println(x))
^
但是你可以验证它为简单类型T
提供了正确的类型,
scala> List(1, 2, 3, 4, 5, 4, 3, 2, 1).toSet.toList.sorted
res0: List[Int] = List(1, 2, 3, 4, 5)
因此,仅指定List[T]
的类型是有效的。
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach((x: List[Int]) => println(x))
List(2, 2, 3)
List(7)
//set type to toSet
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet[List[Int]].foreach(x => println(x))
List(2, 2, 3)
List(7)
为了使你的示例工作,在处理elem时给出toSet
(也见另一个答案 )或elem类型。
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy((x: List[Int]) => x.size)
res2: List[List[Int]] = List(List(7), List(2, 2, 3))
而且,您可以使用.distinct
而不是.toSet
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).distinct.sortBy(_.size)
res3: List[List[Int]] = List(List(7), List(2, 2, 3))
问题来自toSet
的定义:
def toSet[B >: A]: Set[B]
如您所见,有一个类型参数可以推断出来。 Scala仍然可以在你的第一个示例中使用toSet
来推断这toSet
,但是涉及lambda的那个有更复杂的类型推断,Scala显然无法处理。 您可以通过为lambda提供参数类型或更简单地为toSet
类型参数来toSet
:
List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet[List[Int]].toList
.sortBy(_.size)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.