Scala控制抽象

简介: private def filesHere = (new java.io.File(".")).listFiles() def filesEnding(query: String) = for(file containsNeg(List(1, 2, 3, -4)) ...
  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的函数。

 

目录
相关文章
|
11月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
166 5
|
11月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
119 3
|
11月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
168 0
|
11月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
216 0
|
11月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
198 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
11月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
221 0
|
11月前
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
174 0
|
11月前
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
171 0
|
分布式计算 资源调度 Java
Scala+Spark+Hadoop+IDEA实现WordCount单词计数,上传并执行任务(简单实例-下)
Scala+Spark+Hadoop+IDEA实现WordCount单词计数,上传并执行任务(简单实例-下)
178 0