Scala控制抽象

  private def filesHere = (new java.io.File(".")).listFiles()
  def filesEnding(query: String) =
      for(file <- filesHere; if file.getName.endsWith(query))
        yield file

  def filesContaining(query : String) =
    for(file <- filesHere; if file.getName.contains(query))
      yield file

  def filesRegex(query: String) =
    for(file <- filesHere;if file.getName.matches(query))
      yield file

  def filesMatching(query : String,matcher : (String,String)=>Boolean) =
    for(file <- filesHere; if matcher(file.getName,query))
      yield file

//简化代码
  //def filesEnding(query: String) = filesMatching(query, _.endsWith(_))

  //def filesContaining(query: String) = filesMatching(query, _.contains(_))

  //def filesRegex(query: String) = filesMatching(query, _.matches(_))

用在filesEnding方法里的函数文本_.endsWith(_) 等同于(fileName: String, query: String) => fileName.endsWith(query)

原因是filesMatching带一个函数,这个函数需要两个String参数,不过你不需要指定参数类型。因此,你也可以写成(fileName, query) => fileName.endsWith(query)。由于第一个参数,fileName,在方法体中被第一个使用,第二个参数,query,第二个使用,你也可以使用占位符语法:_.endsWith(_)。第一个下划线是第一个参数,文件名的占位符,第二个下划线是第二个参数,查询字串的占位符。

以下是使用了这种方式的方法去判断是否传入的List包含了负数的例子:

def containsNeg(nums: List[Int]): Boolean = {
 var exists = false
 for (num <- nums)
 if (num < 0)
exists = true
 exists }

scala> containsNeg(List(1, 2, 3, 4))
 res0: Boolean = false
 scala> containsNeg(List(1, 2, 3, -4))
 res1: Boolean = true

不过更简洁的定义这个方法的方式是通过在传入的List上调用高阶函数exists

def containsNeg(nums: List[Int] = nums.exists(_<0)

Curry化

展示了curry化后的同一个函数。代之以一个列表的两个Int参数,你把这个函数应用于两个列表的各一个参数

在第一个函数上应用1——换句话说,调用第一个函数并传入1——会产生第二个函数,在第二个函数上应用2产生结果

first和second函数只是curry化过程的一个演示。他们并不直接连接在curriedSum函数上。尽管如此,仍然有一个方式获得实际指向curriedSum的“第二个”函数的参考。你可以用偏应用函数表达式方式,把占位符标注用在curriedSum里.

编写新的控制结构:

op的类型是Double => Double,就是说它是带一个Double做参数并返回另一个Double的函数。

时间: 2025-01-15 13:52:32

Scala控制抽象的相关文章

【scala初学】scala 控制 for while match if

上一章我们共同研究了for循环以及变种.这章我们围绕比较常用的几个其他控制语句学习. 首先,对for进行补充,  For-Comprehensions 格式: for (s ) yield e 举例: var range = 0.until(10) var m = for (p <- range if p > 5) yield p println(m); 结果: Vector(6, 7, 8, 9) 下面我们根据官方例子来先大家展示一下,格式如下: //A simple for-compreh

scala抽象类抽象字段

package com.test.scala.test /** * 抽象类学习,定义abstact关键字 */ abstract class AbstractClass { val id:Int;//抽象字段,没有带初始值 var age:Int var sex:String } class A(val id:Int) extends AbstractClass{ var age=23; var sex=" 男" } object Test{ def main(args: Array[

控制抽象

所有的函数都可以被分成通用部分,以及非通用部分,这将导致代码存在大量的冗余. 代码1-1 object FileMatcher { private def filesHere = new java.io.File(".").listFiles() def fileEnding(query: String) = for (file <- filesHere; if file.getName.endsWith(query)) yield file def fileContains(q

scala控制流程语句

直接上代码了哈. package com.test.scala.test object Kongzi { def main(args: Array[String]): Unit = { //if 语句,注意scala 没有switch case 语句 var x=1; val s=if(x>0) "hello" else 4; println(s); val m=if(x<0) 'c' else if(x==1) 1 else "i don't know!&quo

程序员的Scala

C#程序员的Scala之路第九章(Scala的层级) 摘要: 1.Scala的类层级Scala里类的顶端是Any所有的类都继承Any类,Any包括以下几个通用方法:final def ==(that: Any): Boolean final def !=(that: Any): Boolean def equals(that: Any): Boolean de...阅读全文 posted @ 2015-03-30 10:15 qg 阅读(2) | 评论 (0) 编辑 C#程序员的Scala之路第

scala与java之间的那些事

scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java. scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写了jdk中的通用代码.可以说java语言本身就是Martin Odersky一步一步看着长大的.所以scala可以说打根起就和JAVA有着远远悠长的血缘关系. Martin Odersky还在写java那会,就立志开发达成一个目标:让写程序这样一个基础工作变得高效.简单.且令人愉悦!因此可以说sca

Scala学习笔记(二)

笔记的整理主要针对Scala对比Java的新特性:   1.if表达式 if表达式是有结果返回的. val a= if (5>2) "你好" else 1 a的值为if表达式返回值为 "你好"   2.while表达式 while表达式是没有返回值的(返回值为 Unit),在scala中避免使用,通常都需要与var结合使用   3.for表达式 枚举集合遍历 val a = Array(1,2,3,4,5,6) for (i <- a) println(

【转】Scala学习——高阶函数

原文链接 http://nerd-is.in/2013-09/scala-learning-higher-order-functions/ 原文发表于:http://nerd-is.in/2013-09/scala-learning-higher-order-functions/ 在函数式编程语言中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作. 因为Scala混合了面向对象和函数式的特性,所以对Scala来说,函数是“头等公民”. 作为值的函数 1 2 3 import scal

Scala学习笔记:重要语法特性

1.变量声明 Scala 有两种变量, val 和 var  val的值声明后不可变,var可变 val msg: String = "Hello yet again, world!" 或者类型推断 val msg = "Hello, world!" 2.函数定义 如果函数仅由一个句子组成,你可以可选地不写大括号. def max2(x: Int, y: Int) = if (x > y) x else y 3.for循环 打印每一个命令行参数的方法是: ar