Scala学习:简化客户代码

9.2 前一个例子演示了高阶函数能在你实现API的时候帮助减少代码重复。高阶函数的另一个重要应 用是把它们放在API里使客户代码更简洁。Scala的集合类型的特定用途循环方法提供了一个很好的例子 。这些特定用途循环方法被定义在特质Iterable中,被List,Set,Array,还有Map扩展。很多已经在第 三章的表格3.1中列了出来。不过现在请注意其中的一个例子来看看为什么这些方法如此有用。

考虑exists,一个判断传入的值是否包含在集合中的方法。当然你也可以初始化一个var为假,循环 遍历集合类型,检查每个元素,并且如果你找到了要寻找的就把var设置为真,通过这样的方式寻找元素 。以下是使用了这种方式的方法去判断是否传入的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)

这个版本的containsNeg能产生和前面的那个一样的结果:

scala> containsNeg(Nil)  
res2: Boolean = false 
scala> containsNeg(List(0, 1, -2))  
res3: Boolean = true

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索list
, 寻找源代码
, boolean
, 方法
, exists
, 例子
, 一个
判断list是否包含
,以便于您获取更多的相关知识。

时间: 2024-11-03 21:50:26

Scala学习:简化客户代码的相关文章

机器学习(三)--- scala学习笔记

 Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性.    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法. 一.sca

scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person { var name: String = _ /** * 从构造器 * @param name */ def this(name: String) = { this //注意:从构造器,必须先调用主构造器 this.name = name; } override def toString = { "

Scala 学习笔记(转)

问题描述 scala是以实现scaleablelanguage为初衷设计出来的一门语言.官方中,称它是object-orientedlanguage和functionallanguage的混合式语言.并且,scala可以和java程序无缝拼接,因为scala文件编译后也是成为.class文件,并且在JVM上运行.不过,我更关心的是它的scaleable(扩展性).一门语言到底怎样才算有扩展性呢?对语言而言什么是它的扩展性呢?个人拙见,认为语言的扩展性可能包括两个方面:1.语言本身的扩展性2.由此

Scala 学习

1.强类型语言 弱类型语言 强类型语言:定义对象或变量时,需要指定其归属类型 一旦一个变量类型确定,它所归属的类型不可再变 弱类型语言:定义变量时不用指定变量类型 在程序运行中,可以改变变量的的归属类型 scala变量定义: var str = "abcd" java: String str = "abcd" 这样写法不是没有指定str的类型,而是没有显式的指定str的类型,它隐式的从变量值中自动判断 显式写法: var str:String = "abc

Scala学习:叫名参数by-name parameter

上节展示的withPrintWriter方法不同于语言的内建控制结构,如if和while,在于大括号之间的代码 带了参数.withPrintWriter方法需要一个类型为PrintWriter的参数.这个参数以"writer =>"方 式显示出来: withPrintWriter(file) { writer => writer.println(new java.util.Date) } 然而如果你想要实现某些更像if或while的东西,根本没有值要传入大括号之间的代码,那

Scala学习:Curry化的函数

在第1章,我们说过Scala允许你创建新的"感觉像是原生语言支持"的控制抽象.尽管到目前你已经 看到的例子都的确是控制抽象,不过任何人都不会误以为它们是原生语言支持的.为了搞明白如何让控 制抽象感觉更像语言的扩展,你首先需要明白称为curry化的函数式编程技巧. curry化的函数被应用了多个参数列表,而不是仅仅一个.代码9.2展示了一个规整的,未被curry化 的函数,它实现两个Int型参数,x和y的加法. scala> def plainOldSum(x: Int, y: I

[Scala]Scala学习笔记七正则表达式

1. Regex对象 我们可以使用scala.util.matching.Regex类使用正则表达式.要构造一个Regex对象,使用String类的r方法即可: val numPattern = "[0-9]+".r 如果正则表达式包含反斜杠或引号的话,那么最好使用"原始"字符串语法"""...""": val positiveNumPattern = """^[1-9]\d*

Scala学习笔记

1类型自动匹配(模式匹配) 2函数是有值的(匿名函数是函数的常态) 递归函数需要指定返回值 3.内部类隶属于外部类的实例本身,而java内部类属于外部类,对外部类的依赖路径依赖 4.object类似于java中的静态内部类 里面的所有成员都是静态的,适用于配置文件 静态都是用来修饰类的内部成员的.比如静态方法.静态成员变量.它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得.这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得. 5.同

scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例

package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaApp02 { def main(args: Array[String]) { tupleDemo println mapDemo println arrayDemo println fileWriteAndRead println(getUrlContent("http://www.cnblogs.