1.简化代码

package com.scala.first

import java.io.File
import javax.management.Query /**
* Created by common on 17-4-5.
*/
object FileMatcher { def main(args: Array[String]) { for (file <- filesHere)
println(file) println() for (file <- filesMatching("src", _.endsWith(_)))
println(file) for (file <- filesEnding("src"))
println(file) } private def filesHere = (new File(".")).listFiles //matcher是传入一个函数,返回boolean值,比如_.endsWith(_)
private def filesMatching(query: String, matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query)) yield file
} //上面的函数不够简洁,下面是更加简洁的定义
private def filesMatch(matcher: String => Boolean) = {
for (file <- filesHere; if matcher(file.getName)) yield file
} //然后可以定义使用不同matcher()的方法
def filesEnding(query: String) = {
filesMatch(_.endsWith(query))
} //使用exists来简化代码
def containsOdd(nums: List[Int]): Boolean = {
nums.exists(_ % 2 == 1)
} def containsNeg(nums: List[Int]): Boolean = {
nums.exists(_ < 0)
} }

输出是

./.idea
./build.sbt
./target
./input
./project
./src ./src
./src

2.柯里化

//柯里化,可以看成是两个函数,y是第一个函数sum(x: Int)的参数
def sum(x: Int)(y: Int) = {
x + y
} //println(sum2(2))的输出是4
def sum2 = sum(2)_

3.继承

package com.scala.first

/**
* Created by common on 17-4-16.
*/
object AbstractClass { def main(args: Array[String]): Unit = {
val ae = new ArrayElement(Array("hello", "world"))
println(ae.width) val list1 = List(1,2,3,4)
val list2 = List(1,2,3,4,5)
//Scala中同时遍历两个list,如果长度不一样会截去
for((line1,line2) <- list1 zip list2){
println(line1+line2)
}
} } //定义一个抽象类
abstract class Element { //定义无参方法,抽象成员
def contents: Array[String] def height: Int = contents.length def width: Int = if (height == 0) 0 else contents(0).length } //扩展类,继承了上面的抽象类,需要实现抽象类中的方法
class ArrayElement(content: Array[String]) extends Element {
def contents: Array[String] = content
} //更加简洁的写法,contents和Element中的contents保持一致
class ArrayElement2(val contents: Array[String]) extends Element //另一个例子
class cat {
//确保一个成员不被子类重写,需要把其定义成final
// final val dangerous = false
val dangerous = false
} class tiger(override val dangerous: Boolean, private var age: Int) extends cat

4.特质

package com.scala.first

/**
* Created by common on 17-4-17.
*/
object Trait { def main(args: Array[String]): Unit = {
val person = new Person //变量an可以初始化为任何混入了特质的类的对象,person对象包含了Animal特质
val an: Animal = person
println(an.toString) val p = new PP()
//输出People特质中的内容
p.say() } } trait Animal { def run(): Unit = {
println("Animal can run")
}
} //具有特质Animal
class Person extends Animal {
override def toString = "can say"
} //具有特质Animal
class Tiger extends Animal {
override def toString = "can run fast"
} //一个类只能继承一个父类。但是能混入多个特质
//特征的作用:
//1.把胖接口转换成瘦接口
//2.为类提供可堆叠的改变
class Live trait HasLeg //注意不能给特质中传递任何的参数
class PersonTiger extends Live with Animal with HasLeg {
println("混入了多个特质")
} class P {
def say(): Unit = {
println("I am a people")
}
} //特质在抽象方法中的动态绑定
trait People extends P {
abstract override def say(): Unit = {
println("I am a trait people")
}
} class PP extends People{
//输出People特质中的内容
}

Scala学习笔记——简化代码、柯里化、继承、特质的更多相关文章

  1. 从0开始的Python学习007函数&函数柯里化

    简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...

  2. Scala基础:闭包、柯里化、隐式转换和隐式参数

    闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...

  3. scala面向对象.高阶函数,柯里化,Actor编程简介

    1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...

  4. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...

  5. (三十八)js之柯里化

    先给大家介绍什么是柯里化与反柯里化 百度翻译: 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的 ...

  6. Scala学习笔记(七):Rational、隐式转换、偏函数、闭包、重复参数及柯里化

    class Rational(n: Int, d: Int) { require(d != 0) private val g: Int = gcd(n, d) val number: Int = n ...

  7. 【React】学习笔记(一)——React入门、面向组件编程、函数柯里化

    课程原视频:https://www.bilibili.com/video/BV1wy4y1D7JT?p=2&spm_id_from=pageDriver 目录 一.React 概述 1.1.R ...

  8. Scala学习之路 (七)Scala的柯里化及其应用

    一.概念 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程.新的函数返回一个以原有第二个参数作为 ...

  9. 大数据学习day17------第三阶段-----scala05------1.Akka RPC通信案例改造和部署在多台机器上 2. 柯里化方法 3. 隐式转换 4 scala的泛型

    1.Akka RPC通信案例改造和部署在多台机器上  1.1 Akka RPC通信案例的改造(主要是把一些参数不写是) Master package com._51doit.akka.rpc impo ...

随机推荐

  1. 通俗讲解 异步,非阻塞和 IO 复用

    1. 阅前热身 为了更加形象的说明同步异步.阻塞非阻塞,我们以小明去买奶茶为例. 1.1 同步与异步 同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式. 同步: 当一个同 ...

  2. bootStrap中的ul导航3-垂直导航

    <div class="container"> <br/> <ul class="nav nav-pills nav-stacked&quo ...

  3. jsp导出简单的excel

    在jsp中加入以下代码即可 <% String fileName = "导出excel.xls"; fileName = new String(fileName.getByt ...

  4. 107. 二叉树的层次遍历 II

    107. 二叉树的层次遍历 II 题意 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历). 解题思路 递归:利用前序遍历的思想,在递归过程中 ...

  5. javascript中break与continue,及return的区别

    a).在循环体中, break是跳出整个循环,不执行以后的循环语句: continue是结束本次循环语句,进入下一个循环: b). 在if判断句,结束该函数的执行时,用 return: c). 在函数 ...

  6. FTP和TCP的文件传输效率对比测试分析

    前言 最近因项目需要,需要把一定数量的中等文件从开发板上传到电脑上,分别选择了FTP和TCP自定义协议两种方式进行传输,进行了简单的对比测试,故做如下记录. 测试环境 开发板:Linux,ARMv7 ...

  7. 写自己的ASP.NET MVC框架(下)

    上篇博客[写自己的ASP.NET MVC框架(上)] 我给大家介绍我的MVC框架对于Ajax的支持与实现原理.今天的博客将介绍我的MVC框架对UI部分的支持. 注意:由于这篇博客是基于前篇博客的,因此 ...

  8. Struts2漏洞拉响网站安全红色警报以及把Struts2更新为最新版本Struts2.3.15.1步骤

    360网站安全检测平台今日发布红色警报称,广泛应用在国内大型网站系统的Struts2框架正在遭到黑客猛烈攻击.利用Struts2“命令执行漏洞”,黑客可轻易获得网站服务器ROOT权限.执行任意命令,从 ...

  9. MySQL架构与业务总结图

    MySQL架构与业务总结图如下:

  10. H5使用Swiper过程中遇到的滑动冲突

    一.问题 (1)PC端可以鼠标可以拖动中间的轮子让页面上下滑动,点击左键按着也是拖不动 (2)手机端浏览H5手指不能滑动页面,导致很多页面下面的文字看不到 二.解决问题 1.下面分先说css的问题,主 ...