如何在值为元组时为HashMap :: retain构造谓词?

问题描述 投票:0回答:2

我有一个类型为的地图:

val m: HashMap[Double, (Double, Long)]

当我运行retain方法时:

m.retain(p => true)

它抱怨Type mismatch. Expected: (Double, (Double, Long)) => Boolean, actual: Double => Boolean

然后我尝试将类型签名添加到参数:

m.retain(p: (Double, (Double, Long)) => true)

然后它抱怨Type mismatch. Expected: (Double, (Double, Long)) => Boolean, actual: (Double, (Double, Long)) => Boolean,这对我没有意义,因为它们是相同的。

我也尝试过:

m.retain((k,(v,t))=>true)

仍然给出类型不匹配错误。

我认为它可能是错误的检查器所以我尝试运行编译器然后给我另一个不同的错误:identifier expected but 'true' found

在这种情况下我该如何保留?

scala
2个回答
3
投票

scala.collection.mutable.MapLike.retain参数p是一个带有两个参数的函数:keyvalue(它不是一个带有tuplekeyvalue的函数)

你需要像这样写:

m.retain((k, v) => true)

或者像这样:

m.retain({
  case (k, v) => true
})

或者像这样:

m.retain({
  case (k, (v1, v2)) => true
})

1
投票

您有以下功能:

//function that takes a function that takes multiple arguments
def test1(f: (Int, Int) => Boolean): Boolean = f(0, 0)
//function that takes a function that takes a tuple
def test2(f: ((Int, Int)) => Boolean): Boolean = f((0, 0))

当您使用PartialFunction并写入时

test1({
  case (v1, v2) => true
})

它等于

test1((arg1, arg2) => (arg1, arg2) match {
  case (v1, v2) => true
})

但是当你使用PartialFunction并编写时

test2({
  case (v1, v2) => true
})

它等于

test2(tuple => tuple match {
  case (v1, v2) => true
})

两种情况看起来都一样,但它们的工作方式不同。在多个参数的情况下,match处理参数元组。在单个元组参数的情况下,match处理这个元组。

© www.soinside.com 2019 - 2024. All rights reserved.