需要帮助理解scala代码片段吗

需要帮助理解scala代码片段吗,scala,Scala,可能重复: 上面的代码段返回列表中长度等于3的字符串元素数。但是我不能理解这个代码片段,因为我很难掌握=>操作符在这个上下文中的用法。任何解释都会非常有用。这只是定义了一个方法,您也可以这样看: def isValid(s:String) = s.length ==3 list.count(isValid) 所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数 这只是定义了一个方法,您也可以这样看: def isValid(s:String) = s.length ==3

可能重复:


上面的代码段返回
列表中长度等于
3
的字符串元素数。但是我不能理解这个代码片段,因为我很难掌握
=>
操作符在这个上下文中的用法。任何解释都会非常有用。

这只是定义了一个方法,您也可以这样看:

def isValid(s:String) = s.length ==3
list.count(isValid)

所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数

这只是定义了一个方法,您也可以这样看:

def isValid(s:String) = s.length ==3
list.count(isValid)

所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数

是的,Scala很难理解。我会尽力解释的,尽管我可能也不太明白

List.count
方法将返回布尔值的
block
代码作为参数

块只是代码的一小部分,可以通过多种方式创建,例如将代码封装在
{}

在scala文档中,这被描述为

def count (p : (A) => Boolean) : Int
因此,
count
接受一个参数
p
,该参数是一个块,它接受类型为
a
的参数并返回一个
布尔值

所以在这个例子中:

s => s.length == 3
是代码的
。块通常遵循以下格式

[arguments] => [Code to execute]
因此在本例中,
s
是块的输入,
s.length==3
是应该返回布尔值的代码。您可以随意命名参数,只要它们的顺序正确

当使用迭代集合的方法时,例如
count
map
each
等,传递的参数将是它迭代的集合中的当前项


如果你想了解更多有关它的信息,你应该查看我的Martin Odersky(scala的创建者)正在运行的Coursera课程,该课程将非常详细地介绍如下细节:

是的,scala可能很难理解。我会尽力解释的,尽管我可能也不太明白

List.count
方法将返回布尔值的
block
代码作为参数

块只是代码的一小部分,可以通过多种方式创建,例如将代码封装在
{}

在scala文档中,这被描述为

def count (p : (A) => Boolean) : Int
因此,
count
接受一个参数
p
,该参数是一个块,它接受类型为
a
的参数并返回一个
布尔值

所以在这个例子中:

s => s.length == 3
是代码的
。块通常遵循以下格式

[arguments] => [Code to execute]
因此在本例中,
s
是块的输入,
s.length==3
是应该返回布尔值的代码。您可以随意命名参数,只要它们的顺序正确

当使用迭代集合的方法时,例如
count
map
each
等,传递的参数将是它迭代的集合中的当前项

如果你想了解更多关于它的信息,你应该查看我的Martin Odersky(scala的创建者)正在运行的Coursera课程,它将非常详细地涵盖这样的细节:

(我没有看到你发布了另一个(重新措辞的)问题。这是我对你的第一个问题的回答)

除了传递值/名称之外,
=>
还用于定义函数文字,这是用于定义函数的另一种语法

示例时间。假设你有一个函数,它接受了另一个函数。集合中充满了它们,但我们将选择
filter
<代码>过滤器
在集合(如列表)上使用时,将删除导致您提供的函数返回false的任何元素

val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy")
// Let's only grab people who have short names (less than 10 characters)
val shortNamedPeople = people.filter(<a function>)
我们在这里所做的是创建一个函数,该函数接受一个字符串(因为
people
的类型是
List[String]
),并返回一个布尔值。很酷吧

这种语法在许多上下文中使用。假设您想编写一个函数,该函数接受另一个函数。这个函数应该接收一个字符串,然后返回另一个字符串

def myFunction(f: String => Int): Int = {
  val myString = "Hello!"
  f(myString)
}
// And let's use it. First way:
def anotherFunction(a: String): Int = {
  a.length
}
myFunction(anotherFunction)
// Second way:
myFunction((a: String) => a.length)
这就是函数文字的含义。返回到按名称<代码>和按值<代码>有一个技巧,您可以强制在需要时才计算参数。经典的例子是:

def logger(message: String) = {
  if(loggingActivated) println(message)
}
这看起来没问题,但是调用
记录器
时实际会计算
消息
。如果
消息
需要一段时间进行评估,该怎么办?例如,
logger(veryLongProcess())
,其中
veryLongProcess()
返回一个字符串。哎呀?不是真的。我们可以利用我们对函数文本的了解,强制在实际需要时才调用
veryLongProcess()

def logger(message: => String) = {
  if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!
logger
现在接收一个不带参数的函数(因此左侧的裸
=>
)。您仍然可以像以前一样使用它,但现在,
消息只有在使用时(在
println
中)才会进行评估。

(我没有看到您发布了另一个(重新措辞的)问题。以下是我对您的第一个问题的回答)

除了传递值/名称之外,
=>
还用于定义函数文字,这是用于定义函数的另一种语法

示例时间。假设你有一个函数,它接受了另一个函数。集合中充满了它们,但我们将选择
filter
<代码>过滤器
在集合(如列表)上使用时,将删除导致您提供的函数返回false的任何元素

val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy")
// Let's only grab people who have short names (less than 10 characters)
val shortNamedPeople = people.filter(<a function>)
我们在这里所做的是创建一个函数,该函数接受一个字符串(因为
people
的类型是
List[String]
),并返回一个布尔值。很酷吧

这种语法在许多上下文中使用。假设您想编写一个接受ano的函数